2012-07-26 87 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;