2012-07-26 13 views
22

Estoy trabajando con OpenCV y C++. Tengo una matriz X como estoActualización de una submatriz de Mat en OpenCV

Mat X = Mat::zeros(13,6,CV_32FC1); 

y quiero actualizar sólo un 4x3 submatriz de ella, pero tengo dudas sobre cómo acceder a esa matriz de una manera eficiente.

Mat mat43= Mat::eye(4,3,CV_32FC1); //this is a submatrix at position (4,4) 

¿Necesito cambiar elemento por elemento?

Respuesta

27

Una de las maneras más rápidas es establecer una matriz de cabecera que apunta a la gama de columnas/filas que desea actualizar, así:

Mat aux = X.colRange(4,7).rowRange(4,8); // you are pointing to submatrix 4x3 at X(4,4) 

Ahora, puede copiar su matriz para AUX (pero en realidad lo copiará a X, porque aux es solo un puntero):

mat43.copyTo(aux); 

Eso es todo.

+1

¡Guau! Me gusta esto es más simple de lo que pensaba, ¡gracias! –

+1

Creo que OpenCV debería agregar un parámetro para controlar si se permite la reasignación de Mat :: copyTo. Si desafortunadamente hago que el tamaño de aux sea diferente de aux, el significado del código cambiará totalmente. – delphifirst

12

En primer lugar, usted tiene que crear una matriz que apunta a la original:

Mat orig(13,6,CV_32FC1, Scalar::all(0)); 

Mat roi(orig(cv::Rect(1,1,4,3))); // now, it points to the original matrix; 

Mat otherMatrix = Mat::eye(4,3,CV_32FC1); 

roi.setTo(5);    // OK 
roi = 4.7f;     // OK 
otherMatrix.copyTo(roi);  // OK 

Tenga en cuenta que cualquier operaciones que implica la atribución directa, con el signo "=" de otra matriz cambiarán la fuente de matriz roi desde orig a esa otra matriz.

// Wrong. Roi will point to otherMatrix, and orig remains unchanged 
roi = otherMatrix;    
Cuestiones relacionadas