【opencv】函数copyTo() 与clone()

本文详细解释了在图像处理中浅拷贝与深拷贝的概念,并通过实例展示了两种拷贝方式的区别。浅拷贝使多个对象指向同一内存区域,而深拷贝则为每个对象分配独立的内存空间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


浅拷贝浅拷贝是指当图像之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。

深拷贝:深拷贝是指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同地方。

copyTo 也是深拷贝,但是否申请新的内存空间,取决于dst矩阵头中的大小信息是否与src一至,若一致则是浅拷贝并不申请新的空间否则先申请空间后再进行拷贝.

clone 是完全的深拷贝,在内存中申请新的空间

用法:

Mat img1 =Mat:: ones(1, 5, CV_32F);
Mat img2 = img1;                                 //赋值为浅拷贝
Mat img3 = Mat::zeros(1, 5, CV_32F);
//img3.copyTo(img1);                             //img1与img2的矩阵头一致则为浅拷贝

img1= img3.clone();                             //clone()为深拷贝
cout << img1 << endl;
cout << img2 << endl;
cout << img3 << endl;

                    

           图1  clone()深拷贝                                                                             图2,矩阵头一样的copyto()浅拷贝

函数原型

Mat clone() const;

void copyTo( OutputArray m ) const;

void copyTo( OutputArray m, InputArray mask) const;

copyTo()有重载


针对图片看下代码:

#include<opencv2\opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main()
{
	//Mat img1 = Mat::ones(1, 5, CV_32F);

	//Mat img2 = img1;
	//Mat img3 = Mat::zeros(1, 5, CV_32F);
	//img3.copyTo(img1);

	////img1= img3.clone();
	//cout << img1 << endl;
	//cout << img2 << endl;
	//cout << img3 << endl;


	Mat img1 = imread("*****************\\图6.68 原始图.jpg");
	/***************赋值时是浅拷贝****************/
	Mat img1 = imread("*********\\图6.68 原始图.jpg");  
	Mat img2 = img1;                //拷贝方式为浅拷贝,两个对象指向同一内存块
	imshow("First", img1);
	imshow("image2", img2);
	if (!img1.data)
	{
		cout << "error! The image is not built!" << endl;
		return -1;
	}
	flip(img2, img2, 1);            //注意应在原地进行镜像变换
	imshow("Second", img1);


	/*********************深拷贝*********/
	//深拷贝是指新创建的图像拥有原始图像的崭新拷贝,即拷贝图像和原始图像在内存中存放在不同地方
	//Mat img2 = img1.clone();        //拷贝方式是深拷贝
	//imshow("First", img1);           
	//if (!img1.data)
	//{
	//	cout << "error! The image is not built!" << endl;
	//	return -1;
	//}
	//flip(img2, img2, 1);
	//imshow("Second", img1);

	waitKey();
	return 0;

}

                                                                                                图3  浅拷贝



                                                                                                图4 深拷贝


参考:http://blog.youkuaiyun.com/qq_23968185/article/details/51242686

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值