Punto de OpenCV (x, y) representa (columna, fila) o (fila, columna)

Tengo una imagen de 300 * 200 en un Matrix src. Estoy haciendo la siguiente operación en la imagen.

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); 

Esperaba que cubriera toda la imagen en blanco, pero la parte inferior de la imagen permanecía vacía. Mientras que si hago esto

  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); 

Toda la imagen está cubierta de blanco. Entonces, esto significa que src.at (i, j) está usando (i, j) como (fila, columna) pero el Punto (x, y) está usando (x, y) como (columna, fila)

Entonces, esto significa que src.at (i, j) está usando (i, j) como (fila, columna) pero el Punto (x, y) está usando (x, y) como (columna, fila)

¡Eso es correcto! Dado que esto parece confundir a muchas personas, escribiré mi interpreación por la razón:

En OpenCV, cv::Mat se usa tanto para imágenes como para matrices, ya que una imagen discreta es básicamente la misma que una matriz.

En matemáticas, tenemos algunas cosas diferentes:

  1. matrices, que tienen varias filas y varias columnas.
  2. gráficos (de funciones), que tienen múltiples ejes y representan gráficamente el gráfico en forma de una imagen.
  3. puntos, que están ordenados por los ejes del sistema de coordenadas que normalmente es una coordenada cartesiana.

1. Para las matrices, la notación matemática es para ordenar en fila-mayor-orden que es

Siguiendo la notación de matriz convencional, las filas se numeran por el primer índice de una matriz bidimensional y las columnas por el segundo índice, es decir, a1,2 es el segundo elemento de la primera fila, contando hacia abajo y hacia la derecha. (Tenga en cuenta que esto es lo opuesto a las convenciones cartesianas).

Tomado de http://en.wikipedia.org/wiki/Row-major_order#Explanation_and_example

Como en matemáticas, row: 0, column: 0 es el elemento superior izquierdo de la matriz. Fila / columna son como en las tablas …

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

2. Para Puntos , se elige un sistema de coordenadas que cumple dos funciones: 1. usa los mismos tamaños de unidad y el mismo “origen” que la notación de la matriz, por lo tanto, arriba a la izquierda es el Punto (0,0) y la longitud del eje 1 significa la longitud de 1 fila o 1 columna 2. usa “notación de imagen” para ordenar el eje, lo que significa que la abscisa (eje horizontal) es el primer valor que designa la dirección xy la ordenada (eje vertical) es el segundo valor que designa la dirección y.

El punto donde se unen los ejes es el origen común de las dos líneas numéricas y simplemente se llama origen. A menudo se denomina O y, de ser así, los ejes se llaman Ox y Oy. Un plano con ejes xey definidos a menudo se denomina plano cartesiano o plano xy. El valor de x se llama coordenada x o abscisa y el valor de y se denomina coordenada y u ordenada.

Las elecciones de letras provienen de la convención original, que es usar la última parte del alfabeto para indicar valores desconocidos. La primera parte del alfabeto se usó para designar valores conocidos.

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

entonces, en un mundo perfecto, elegiríamos el sistema de coordenadas de puntos / imágenes para ser:

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

pero como queremos tener ese origen en la parte superior izquierda y valores positivos para ir al fondo, en cambio:

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

Por lo tanto, para el procesamiento de imágenes, la notación fila por primera vez puede ser extraña, pero para los matemáticos x-axis-first sería extraño acceder a una matriz.

Entonces, en OpenCV puede usar: mat.at(row,column) o mat.at(cv::Point(x,y)) para acceder al mismo punto si x=column e y=row que es perfectamente comprensible =)

Espero esto correcto. No sé mucho sobre las anotaciones, pero eso es lo que me dice mi experiencia en matemáticas e imágenes.

Encontré una solución rápida y rápida a este problema simplemente convirtiendo las coordenadas de opencv en coordenadas cartesianas en el cuarto cuadrante, simplemente colocando un signo (-) en frente de la coordenada y.

De esta forma, pude usar mis algoritmos existentes y todas las ecuaciones de sistema cartesianas estándar con opencv sin poner demasiada sobrecarga en el sistema haciendo una costosa conversión entre sistemas de coordenadas.

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