2012-09-11 16 views
7

según este post y de la documentación de OpenCV, puedo inicializar y acceder a cada elemento de una estera multidimensional.acceder a la submatriz de una estera multidimensional en OpenCV

En realidad, primero codifiqué en MATLAB y ahora necesito convertir a OpenCV. La matriz MATLAB admite acceso a submáquinas como: a (:,:, 3) o b (:,:, 3: 5)

¿Se puede hacer esto en OpenCV? por lo que yo sé, esto se puede hacer con Mat 2D. ¿Qué tal más de 2D?

Edit01: Además, con Mat multidimensional, las propiedades cols y las filas no son suficientes para caracterizar 3 tamaños de la matriz. Hay casos con una dimensión mayor a 3. ¿Cómo almacenar estas propiedades?

Edit02:

// create a 100x100x100 8-bit array 
int sz[] = {100, 100, 100}; 
Mat bigCube(3, sz, CV_8U, Scalar::all(0)); 

que renunciar a la idea del acceso sub-matriz con OpenCV Mat. Tal vez, no es compatible con OpenCV. Pero a partir de este código de muestra, el constructor recibe la 3ª dimensión de 'sz'. ¿A qué propiedad de Mat se le pasa esta tercera dimensión? probablemente en este caso, rows = 100, cols = 100, the other ?? = 100 estoy perdido con la documentación OPENCV

Edit03: el seguimiento de la clase Mat de la fuente OpenCV que he encontrado la definición del constructor en Edit02 de mat.hpp:

inline Mat::Mat(int _dims, const int* _sz, int _type, const Scalar& _s) 
    : flags(0), dims(0), rows(0), cols(0), data(0), refcount(0), 
    datastart(0), dataend(0), datalimit(0), allocator(0), size(&rows) 
{ 
    create(_dims, _sz, _type); 
    *this = _s; 
} 

la siguiente pregunta es dónde y cómo se define la función "crear" aquí? => trazando esta definición Mat en OpenCV probablemente me ayude a modificar/personalizar mis propias características en la matriz Mat

PD: discúlpeme si mi publicación está escrita demasiado desordenada !! Soy un programador novicio, tratando de resolver mi problema de programación. Por favor, siéntete libre de corregirme si mi enfoque no es bueno o correcto. ¡¡Gracias!!

+0

Tengo core.hpp para ver todas las declaraciones de constructor, incluida la de Mat multidimensional. Pero no pude encontrar dónde la definición, me refiero a la codificación de ese constructor, para ver a qué propiedad va la 3ª dimensión. ¿Dónde está ese código fuente? –

+0

Eso estaría allí: /modules/core/src/matrix.cpp. Estoy editando mi respuesta sobre su problema original debajo de – remi

+0

¿Terminó escribiendo este código? Estoy a punto de tener que hacer lo mismo ... – kmac

Respuesta

6

puede acceder fácilmente a submatriz de 2D cv :: Mat utilizando funciones rowRange, colRange o incluso

cv::Mat subMat = originalMat(cv::Rect(x,y,width,height)); 

Además, el número de canales en una matriz, que se puede definir en el constructor de la matriz, se puede usar como la tercera dimensión (pero está limitado a 256 o 512, creo).

También existe la plantilla cv :: Mat_ clase que se puede adaptar para adaptarse a su propósito

[editar]

He comprobado el constructor durante> 2 matrices tridimensionales. Cuando lo ejecuta, el campo filas y columnas de Mat se establece en -1. El tamaño real de la matriz se almacena en Mat :: size como una matriz de int. Para la matriz de dimensiones> 2 no puede usar los constructores de submatrices utilizando un cv :: Rect o rowRange/colRange.

Me temo que tienes que trabajar un poco para extraer submatrices para dim> 2, trabajando directamente con los datos de la fila. Pero puede usar la información almacenada en Mat :: step que le indica el diseño de la matriz. Esto se explica en el official documentation.

+0

..so quieres decir, debo escribir funciones separadas para hacer este tipo de acceso de matriz? o para agregarlos a la clase Mat escribiendo myMat, por ejemplo? esto es una especie de pregunta tonta, pero como programador aficionado, realmente quiero saber cómo se hacen las cosas en el camino de los profesionales –

+0

Los profesionales solo intentan hacer las cosas funcionan :) En su caso, puede ser útil escribir una función para acceder Datos N-dimensionales. No me molestaría en escribir una nueva clase. – remi

+0

No quiero cerrar esta publicación porque quiero lograrlo escribiendo mi propia clase/funciones y publicarlas aquí como un ejercicio. Entonces discúlpame por eso :) –

Cuestiones relacionadas