OpenCV的Mat变量之间拷贝分浅拷贝和深拷贝(由于3.0以后对IplImage变量不再使用,所以这里仅考虑Mat变量)
一. 浅拷贝
Mat a;
Mat b = a; //a "copy" to b
Mat c(a); //a "copy" to c
注意:浅拷贝不复制数据只创建矩阵头,实现数据共享,更改a, b, c三个变量中的任意一个都会对另外2个产生同样的作用。
二. 深拷贝
Mat a, b, c, d;
a.copyTo(b); // a copy to b
c = a.clone(); // a copy to c
a.convertTo(d, a.type()); // a copy to d
注意:深拷贝是完全拷贝,拷贝完成后得到一个独立的变更,数据自治,更改a, b, c, d四个变量中的任意一个都不会影响其它变量。
三. ROI
1. 浅拷贝
Mat B = A(Range::all(), Range(1, 3));
Mat B = A(Rect(0,0,100,100));
A和B共享内存,B只获得了A中ROI区域的位置信息,如下图(懒得画图了,从网上找了张图,变量不对应,请领会精神!)
2. 深拷贝
opencv中给出的例子是
Rect r(1, 1, 10, 20); // 指定src 的 ROI子图像区域
Mat dstroi =dst(Rect(0,10,r.width,r.height)); // 拿到 dst指定区域子图像的引用
src(r).convertTo(dstroi, dstroi.type(), 1,0); // ROI子图像之间的复制
此时,无需指定图像的ROI,计算与方便,清晰
另外,还可以用mask来拷贝,这里只给出一种方法,还会有不同的方法
main()
{
Mat matSrc = imread("e:/template/lena.jpg");
Mat matDst;
Mat matMask(matSrc.size(),CV_8UC1,Scalar(0));
Rect rect(0, 0, 100, 100);
//绘制mask
rectangle(matMask,rect,Scalar(255),-1);
//带有mask的copyto
matSrc.copyTo(matDst,matMask);
waitKey();
return 0;
}