一、引言
对于Mat容器的拷贝有三种方式:
(1)使用构造函数
Mat A=imread("girl.jpeg");
Mat B(A);//将A拷贝到B
(2)利用赋值符号进行拷贝
Mat A=imread("girl.jpeg");
Mat B=A;
(3)使用方法Mat::copyTo()
Mat A=imread("girl.jpeg");
Mat B;
A.copyTo(B);
(4)使用方法Mat::clone()
Mat A=imread("girl.jpeg");
Mat B=A.clone();
但是,对于上面不同的拷贝方法,对于图片的操作结果是不一样的,由此引出浅拷贝与深拷贝。
先说结论:(1) 和(2)是属于浅拷贝;(3)和(4)属于深拷贝。
二、浅拷贝
浅拷贝可以理解为仅仅是将地址指针给拷贝了,并没有为新的对象开辟新的内存空间,也就是说当改变新的对象时,原来的对象也会被改变。
三、深拷贝
深拷贝就是将图片数据拷贝了,并建立了新的内存空间,也就是说新旧对象是相互独立的。
四、操作实例
浅拷贝:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
namedWindow("原来的对象", 0);
namedWindow("新建的对象", 0);
Mat img1 = imread("girl.jpeg"); //将任意一张名为girl.jpeg的图片放置于工程文件夹中
/****浅拷贝方式1****/
Mat img2;
img2=img1;
/****浅拷贝方式2****/
//Mat img2(img1);
//在img2上画圆圈
cv::circle(img2, Point(200, 200), 100, cv::Scalar(0, 0, 255),10);
//显示图片
imshow("原来的对象", img1);
imshow("新建的对象", img2);
waitKey();
return 0;
}
效果:
深拷贝:
#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
namedWindow("原来的对象", 0);
namedWindow("新建的对象", 0);
Mat img1 = imread("girl.jpeg"); //将任意一张名为girl.jpeg的图片放置于工程文件夹中
/****深拷贝方式1****/
Mat img2;
img1.copyTo(img2);
/****深拷贝方式2****/
//Mat img2;
//img2 = img1.clone();
//在img2上画圆圈
cv::circle(img2, Point(200, 200), 100, cv::Scalar(0, 0, 255),10);
//显示图片
imshow("原来的对象", img1);
imshow("新建的对象", img2);
waitKey();
return 0;
}
效果: