Punto OpenCV (x, y) rappresenta (colonna, riga) o (riga, colonna)

Ho un’immagine 300 * 200 in un src Matrix. Sto facendo la seguente operazione sull’immagine.

for(int i=0;i<src.rows;i++){ for(int j=0;j<src.cols;j++){ line( src, Point(i,j),Point(i,j), Scalar( 255, 0, 0 ), 1,8 ); } ] imshow("A",src); waitKey(0); 

Mi aspettavo che coprisse l’intera immagine in bianco, ma una porzione inferiore dell’immagine rimanesse vuota. Mentre se lo faccio

  for(int i=0;i<src.rows;i++){ for(int j=0;j<src.cols;j++){ src.at(i,j)=255; } ] imshow("A",src); waitKey(0); 

L’intera immagine è coperta di bianco. Quindi, questo significa che src.at (i, j) sta usando (i, j) come (riga, colonna) ma Point (x, y) sta usando (x, y) come (colonna, riga)

Quindi, questo significa che src.at (i, j) sta usando (i, j) come (riga, colonna) ma Point (x, y) sta usando (x, y) come (colonna, riga)

È giusto! Dato che questo sembra confondere molte persone scriverò la mia interpreazione per la ragione:

In OpenCV, cv::Mat è usato per entrambe, immagini e matrici, poiché un’immagine discreta è fondamentalmente la stessa di una matrice.

In matematica, abbiamo alcune cose diverse:

  1. matrici, che hanno un numero di righe e un numero di colonne.
  2. grafici (di funzioni), che hanno assi multipli e rappresentano graficamente il grafico sotto forma di un’immagine.
  3. punti, che sono ordinati dagli assi del sistema di coordinate che normalmente è una coordinata cartesiana.

1. Per le matrici la notazione matematica è ordinare in ordine di riga maggiore che è

Seguendo la notazione convenzionale della matrice, le righe sono numerate dal primo indice di una matrice e colonne bidimensionali dal secondo indice, cioè, a1,2 è il secondo elemento della prima riga, contando verso il basso e verso destra. (Nota questo è l’opposto delle convenzioni cartesiane.)

Tratto da http://en.wikipedia.org/wiki/Row-major_order#Explanation_and_example

Come in matematica, riga: 0, colonna: 0 è l’elemento in alto a sinistra della matrice. Riga / colonna sono come nelle tabelle …

 0/0---column---> | | row | | v 

2. Per Punti viene scelto un sistema di coordinate che soddisfa due cose: 1. usa le stesse dimensioni unitarie e la stessa “origine” della notazione della matrice, quindi in alto a sinistra è Punto (0,0) e la lunghezza dell’asse 1 significa la lunghezza di 1 riga o 1 colonna. 2. utilizza “notazione immagine” per l’ordinamento degli assi, il che significa che l’ascissa (asse orizzontale) è il primo valore che indica la direzione x e l’ordinata (asse verticale) è il secondo valore che indica la direzione y.

Il punto in cui gli assi si incontrano è l’origine comune delle due linee numeriche e viene semplicemente chiamato l’origine. Spesso è etichettato come O e se è così allora gli assi sono chiamati Ox e Oy. Un piano con assi xey definiti viene spesso definito piano cartesiano o piano xy. Il valore di x è chiamato coordinata x o ascissa e il valore di y è chiamato coordinata y o ordinata.

Le scelte di lettere provengono dalla convenzione originale, che consiste nell’usare l’ultima parte dell’alfabeto per indicare valori sconosciuti. La prima parte dell’alfabeto è stata utilizzata per designare valori noti.

http://en.wikipedia.org/wiki/Cartesian_coordinate_system#Two_dimensions

quindi in un mondo perfetto dovremmo scegliere il sistema di coordinate di punti / immagini per essere:

  ^ | | Y | | 0/0---X---> 

ma dal momento che vogliamo avere quell’origine in alto-sinistra e valori positivi per andare in fondo, è invece:

 0/0---X---> | | Y | | v 

Quindi, per l’elaborazione delle immagini, la notazione di riga prima potrebbe essere strana, ma per i matematici l’asse x-prima sarebbe strano accedere a una matrice.

Quindi in OpenCV puoi usare: mat.at(row,column) o mat.at(cv::Point(x,y)) per accedere allo stesso punto se x=column e y=row che è perfettamente comprensibile =)

Spero che questo sia corretto. Non so molto delle notazioni, ma è quello che mi dice la mia esperienza in matematica e imaging.

Ho trovato una soluzione rapida e veloce a questo problema, semplicemente convertendo le coordinate da opencv a coordinate cartesiane nel 4 ° quadrante, semplicemente mettendo un segno (-) ve davanti alla coordinata y.

In questo modo, sono stato in grado di utilizzare i miei algoritmi esistenti e tutte le equazioni di sistema cartesiane standard con opencv senza sovraccaricare troppo il sistema effettuando una conversione costosa tra i sistemi di coordinate.

 0/0---X---> | | Y | | v (opencv) 0/0---X----> | | | -Y | | v (4th quadrant)