2012-07-26 96 views
22

我正在使用OpenCV和C++。我有一個矩陣X這樣在OpenCV中更新Mat的子矩陣

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

,我想更新只是它的一個子矩陣4x3的,但我對如何訪問矩陣以有效的方式表示懷疑。

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

我是否需要更改元素?

回答

27

其中一個最快捷的方法是設置一個頭矩陣指向列的量程要更新/行,像這樣:

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

現在,您可以複製矩陣AUX(但實際上你將其複製到X,因爲奧克斯只是一個指針):

mat43.copyTo(aux); 

完蛋了。

+1

不錯!我喜歡這比我想象的更簡單,謝謝! – 2012-07-26 07:14:34

+1

我認爲OpenCV應該添加一個參數來控制是否允許重新分配Mat :: copyTo。如果我不喜歡使aux的大小與aux不同,代碼的含義將會完全改變。 – delphifirst 2014-09-23 03:53:02

12

首先,你必須創建一個指向原來的一個矩陣:

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 

記住任何操作,從另一個矩陣包括直接歸屬,用「=」號將改變從原始到其他矩陣的roi矩陣源。

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