2012-07-26 9 views
22

Pracuję z OpenCV i C++. Mam macierz X jak tenAktualizowanie podmacie Mat w OpenCV

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

i chcę zaktualizować tylko 4x3 podmatrycy z nim, ale nie mam wątpliwości, w jaki sposób uzyskać dostęp do matrycy w sposób efektywny.

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

Czy muszę zmieniać element po elemencie?

Odpowiedz

27

Jednym z najszybszych sposobów jest ustawienie matrycy nagłówka skierowaną do zakresu kolumn/wierszy, które chcesz zaktualizować, tak:

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

Teraz można skopiować macierz AUX (ale faktycznie cię skopiuje go do X, ponieważ Aux to tylko wskaźnik):

mat43.copyTo(aux); 

To się dzieje.

+1

Nice! Podoba mi się to jest prostsze niż myślałem, dzięki! –

+1

Myślę, że OpenCV powinien dodać parametr, aby kontrolować, czy dozwolona jest realokacja Mat :: copyTo. Jeśli pechowo sprawię, że rozmiar Aux różni się od Aux, znaczenie kodu zostanie całkowicie zmienione. – delphifirst

12

Najpierw trzeba utworzyć macierz, który wskazuje na oryginalny:

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 

Należy pamiętać, że wszelkie operacje, które polega na bezpośrednim ujęcie, z „=” znak z innej matrycy zmieni źródło matrycy roi od oryginału do tej innej macierzy.

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