【OpenCV】几种Mat类拷贝复制方法对比

Mat类拷贝方法

博主曾经在编写opencv程序时发现,源图像在没有主动更改的情况下发生了变化。导致这样的原因很可能是Mat类在拷贝时所使用的方法不正确,初学者在不了解opencv内重载了运算符“=”的情况下,容易按照传统的思维来使用Mat B = Mat A。下面介绍一下Mat类的几种拷贝方法(Mat A copy to Mat B):

1.浅拷贝
B = A
B(A)
这类拷贝方法仅创建了新的矩阵头,共用同一个内存空间,在修改新对象的时候,旧对象也会改变。

2.深拷贝
B = A.clone()
A.copyTo(B)
这类拷贝方法为新的矩阵申请了新的内存空间,在修改新对象的时候,旧对象不会改变。

Mat B = Mat A

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
	Mat src = imread("00.jpg");//input source image
	Mat dst = src;//copy image
	rectangle(dst, Rect(50, 50, 300, 300), { 0, 0, 255 }, 2, 8);//draw a rectangle
	imshow("srcImage", src);//display source image
	imshow("copyImage", dst);//display copied image
	waitKey(0);
	return 0;
}

源图像随复制图像发生了改变(绘制了矩形框)。
在这里插入图片描述

Mat B(Mat A)

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
	Mat src = imread("00.jpg");//input source image
	Mat dst(src);//copy image
	rectangle(dst, Rect(120, 30, 250, 400), { 0, 0, 255 }, 2, 8);//draw a rectangle
	imshow("srcImage", src);//display source image
	imshow("copyImage", dst);//display copied image
	waitKey(0);
	return 0;
}

源图像随复制图像发生了改变(绘制了矩形框)。
在这里插入图片描述

Mat B = Mat A.clone()

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
	Mat src = imread("00.jpg");//input source image
	Mat dst = src.clone();//copy image
	rectangle(dst, Rect(120, 30, 250, 400), { 0, 0, 255 }, 2, 8);//draw a rectangle
	imshow("srcImage", src);//display source image
	imshow("copyImage", dst);//display copied image
	waitKey(0);
	return 0;
}

源图像没有随复制图像发生了改变。
在这里插入图片描述

Mat A.copyTo(Mat B)

#include <opencv2\opencv.hpp>
using namespace cv;
int main()
{
	Mat src = imread("00.jpg");//input source image
	Mat dst;
	src.copyTo(dst);//copy image
	rectangle(dst, Rect(120, 30, 250, 400), { 0, 0, 255 }, 2, 8);//draw a rectangle
	imshow("srcImage", src);//display source image
	imshow("copyImage", dst);//display copied image
	waitKey(0);
	return 0;
}

源图像没有随复制图像发生了改变。
在这里插入图片描述
如有错误,欢迎指正!

  • 32
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值