vector3b push_back initialize convertto opencv

push_back - scalar opencv



Inicializar una Mat de OpenCV con una matriz 2D (4)

Además de las respuestas anteriores, hay otra opción .

Para un dato más pequeño, preferiría lo siguiente:

Mat A = (Mat_<float>(2, 5) << 1, 2, 3, 4, 5, 7, 8, 9, 10, 11);

Puede obtener fácilmente el resultado deseado sin la necesidad de definir una variable adicional ''datos''.

En mi aplicación, quiero crear una Mat de OpenCV A (2-Dimensiones) que tenga algunos valores y luego pasarla a otra función de OpenCV usando A como entrada.

Actualmente estoy intentando:

// float data[2][5] = {{1,2,3,4,5},{7,8,9,10,11}}; // OR float data[10] = {1,2,3,4,5,7,8,9,10,11}; // and then // A = Mat(1, 5, CV_32FC1, &data, 2); // init from float 1D - array // OR A = Mat(2, 5, CV_32FC1, &data, 2);

en el caso de la matriz 1D, el valor que pasa es correcto. Pero esto no funciona para la matriz 2D, que es aún más un caso común. ¿Cómo puedo resolver esto en OpenCV?


Dado que los data son matrices 2D, todos los data , &data , *data , data[0] , &data[0] , y &data[0][0] apuntan a la base de la matriz. Se podría elegir cualquiera de las representaciones anteriores para construir correctamente el Mat en lugar de X en

A = Mat(2, 5, CV_32FC1, X );

Tenga tranquilidad ya que los datos son accepted por OpenCV como void* y el acceso a los datos por OpenCV está en line . Prefiero la misma sintaxis para construir Mat a partir de matrices unidimensionales o multidimensionales.

A = Mat(1, 10, CV_32FC1, data ); //for 1D array A = Mat(2, 5, CV_32FC1, data ); //for 2D array

Volver a la consulta: tenga en cuenta que su construcción de Mat incluso desde la matriz 1D es incorrecta. El parámetro de paso se menciona como 2. Simplemente sucedió que funciona, ya que OpenCV overrides el parámetro de paso provisto, si el número de filas es 1. Para las matrices de mayor dimensión, OpenCV lanza la depuración de depuración para el parámetro de paso incorrecto, que usted obtuvo.


Si bien su respuesta es correcta para su situación, es bueno saber qué significa step y AUTO_STEP

Normalmente, las imágenes se almacenan en bloques continuos de memoria. Cada fila sigue después de la anterior, por lo que puede acceder a los datos mediante un puntero con un simple

data = dataPtr[currentCol + width * currentRow];

Donde ancho es el ancho de fila en bytes (no en píxeles)

Pero este no es siempre el caso: a veces se accede a una submatriz, y los datos son continuos en cada fila, pero para ir a la siguiente fila debe saltar una secuencia de bytes.

Aquí es donde entra el paso (también conocido como zancada). Representa la distancia, en bytes, entre dos filas consecutivas. En matrices continuas, su valor es sizeof(pixel)*rowWidth , pero puede tener valores personalizados en situaciones especiales. Cuando pasas AUTO_STEP al constructor Mat, sabe que los datos son continuos y calcula el paso con la fórmula anterior. Así que ahora, el enfoque más correcto para leer los valores de píxeles es

data = dataPtr[currentCol + step * currentRow];

Que funciona para todo tipo de imágenes.

Por último, pero no menos importante, no olvide que el paso se mide en bytes , no en píxeles . Entonces, si tiene una imagen RGB uchar de 3 canales, el paso será 3*number of pixels , y si tiene una imagen int de 3 canales, step = 3(channels)*(4=sizeof(int))*(number rows)


originalmente, usé la mnemotécnica de las guías en línea de OpenCV:

Mat::Mat(Size size, int type, void* data, size_t step=AUTO_STEP)

Pero no entendí lo que significa el documento con "size_t step = AUTO_STEP". Y esto significa que puedo omitir el argumento de "paso" con el que OpenCV elegirá automáticamente AUTO_STEP

Lo he intentado y esto funciona:

A = Mat(2, 5, CV_32FC1, &data);

para el Mat 2D inicializado desde la matriz