OpenCV拷贝与ROI

来源:互联网 发布:大数据进阶 编辑:程序博客网 时间:2024/06/08 06:14

OpenCV的Mat变量之间拷贝分浅拷贝和深拷贝(由于3.0以后对IplImage变量不再使用,所以这里仅考虑Mat变量)


一. 浅拷贝

Mat a;Mat b = a; //a "copy" to bMat c(a); //a "copy" to c

注意:浅拷贝不复制数据只创建矩阵头,实现数据共享,更改a, b, c三个变量中的任意一个都会对另外2个产生同样的作用。


二. 深拷贝

Mat a, b, c, d;a.copyTo(b); // a copy to bc = a.clone(); // a copy to ca.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; }


原创粉丝点击