【OpenCV学习笔记1】Mat的浅复制与深复制

.当学习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不发生变化:
在这里插入图片描述
.深复制与浅复制的示意图:
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值