OpenCV拷贝与ROI

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;
 
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值