一.当学习OpenCV的图像混合时遇到一个困惑,用Rect类截取了原图像的一部分采用赋值符号“=”赋给一个新的Mat后,Mat与另外一张大小相同的图片addWeighted混合后,污染了原图;但是当采用copyTo和clone的方式却对原图没有产生影响。仔细查找了一下,发现这个和Mat的浅复制和深复制有关,即Mat src=imread(“picture.jpg”),Mat R=src,这种赋值操作是浅复制,R只是得到了头部和地址,一旦R被操作改变,则src也会跟着改变;
当采取Mat R=src.clone()或者Mat R; src.copyTo(R)时是深复制,R得到新的内存,不再与src共享其内存,R之后的操作就无法影响src,代码例子如下:
1.采用“=”赋值
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("dota2.jpg");
Mat logo= imread("dota2logo.png");
if (src.empty())
{
cout << "Can not find th picture....";
return -1;
}
if (logo.empty())
{
cout << "Can not find th picture....";
return -1;
}
Mat roil;
Rect rect1(800,400,logo.cols,logo.rows);//定义一个Rect类截取src中的一个区域
roil = src(rect1);//把截取到的图片赋给roil
addWeighted(roil,0.5,logo,0.8,0,roil);//混合roil和另外的图片logo
imshow("Roil", roil);
imshow("Src",src);
waitKey(0);
return 0;
}
结果如下:
原图src
logo
代码运行以后显示src:
2.采用clone或者copyTo的方式赋值:
//赋值语句改为以下其中之一:
src(rect1).copyTo(roil);
//或者
roil=src.(rect1).clone();
运行结果如下:
原图:
运行后显示src不发生变化:
二.深复制与浅复制的示意图: