variable matriz library define copyto opencv types

matriz - opencv matrix format



En OpenCV, ¿cuál es la diferencia entre CV_8U y CV_8UC1? (2)

En OpenCV, ¿hay alguna diferencia entre CV_8U y CV_8UC1? ¿Ambos se refieren a un tipo sin signo de 8 bits con un canal? Si es así, ¿por qué hay dos nombres? Si no, ¿cuál es la diferencia?


Se puede ver en this respuesta, que evalúan a tipos idénticos.

En cuanto a por qué hay dos nombres, si observa cómo están estructurados los #defines (nuevamente, vea la respuesta vinculada), un tipo en OpenCV tiene 2 partes, la profundidad y la cantidad de canales. El sistema es lo suficientemente flexible como para permitirle definir nuevos tipos con hasta 512 canales. Da la casualidad de que cuando especifica 1 canal, el componente de tipo de canal se establece en 0, lo que hace que el resultado sea equivalente a simplemente usar la profundidad CV_8U.


Deberían ser iguales. Para mí, prefiero usar CV_8UC1 ya que hace que mi código sea más claro que la cantidad de canales con los que estoy trabajando.

Sin embargo, si está tratando con una matriz que tiene 10 canales o más, debe especificar el número de canales.

Es posible que desee experimentar con la cantidad de canales utilizando el fragmento de código a continuación.

#define CV_MAT_ELEM_CN( mat, elemtype, row, col ) / (*(elemtype*)((mat).data.ptr + (size_t)(mat).step*(row) + sizeof(elemtype)*(col))) ... CvMat *M = cvCreateMat(4, 4, CV_32FC(10)); for(int ch = 0; ch < 10; ch++) { for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { CV_MAT_ELEM_CN(*M, float, i, j * CV_MAT_CN(M->type) + ch) = 0.0; cout << CV_MAT_ELEM_CN(*M, float, i, j * CV_MAT_CN(M->type) + ch) << " "; } } cout << endl << endl; } cvReleaseMat(&M);

crédito: http://note.sonots.com/OpenCV/MatrixOperations.html