OpenCV图像拷贝方法与注意点(=、copy、clone)

下面介绍三种OpenCV复制图像的方法:

方法1、重载运算符=

使用重载运算符“=”进行的拷贝是一种浅拷贝,虽然它们有不同的矩阵头,但是二者共享相同的内存空间,二者内容相互关联,任何一个变量变化的同时另一个变量也随之改变。

/*OpenCV v1版本*/
IplImage img_origin = cvLoadImage(".\\picture.jpg", CV_LOAD_IMAGE_COLOR); // 读取一张彩色图 
IplImage img_copy = img_origin;  // 直接赋值,浅拷贝

/*OpenCV v2之后版本*/
Mat img_origin = imread(picture, IMREAD_COLOR);  // 读取一张彩色图 
Mat img_copy = img_origin; 

方法2、cvCopy

cvCopy的原型是:
void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask CV_DEFAULT(NULL) );
OpenCV官网关于cvCopy函数的介绍
在使用这个函数之前,必须先用cvCreateImage()一类的函数开辟一段内存,然后传递给dst。cvCopy会把src中的数据复制到dst的内存中。这是一种深拷贝,真正地拷贝了一个新的图像矩阵,此时二者相互之间没有影响,但是如果设置了ROI、COI,copy只会复制ROI、COI区域的内容。

/*OpenCV v1版本*/
IplImage img_origin = cvLoadImage(".\\picture.jpg", CV_LOAD_IMAGE_COLOR); // 读取一张彩色图 
IplImage img_copy = cvCreateImage(Size(img_origin->width, img_origin ->height), img_origin ->depth, img_origin ->nChannels); 
// 开辟一个新的内存空间,图像的大小、深度与颜色通道与原图保持一致
cvCopy(img_origin, img_copy);  // 拷贝图像

/*OpenCV v2之后版本*/
Mat img_origin = imread(picture, IMREAD_COLOR);  // 读取一张彩色图 
Mat img_copy;
img_origin.copyTo(img_copy);  //在拷贝数据前会有一步img_copy.create(this->size , this->type)  

方法3、cvCloneImage

cvCloneImage的原型是:
IplImage* cvCloneImage( const IplImage* image );
OpenCV官网关于cvCloneImage函数的介绍
在使用函数之前,不用开辟内存。该函数会自己开一段内存,然后复制好图像里面的数据,然后返回这段内存中的数据。clone是把所有的都复制过来,不论你是否设置了ROI、COI等影响,clone都会原封不动的克隆过来。用clone复制后,如果源图像在内存中消失,复制的图像也变了,而用copy复制,源图像消失后,复制的图像不变。

/*OpenCV v1版本*/
IplImage img_origin = cvLoadImage(".\\picture.jpg", CV_LOAD_IMAGE_COLOR); // 读取一张彩色图 
IplImage img_copy = cvCloneImage(img_origin);

/*OpenCV v2之后版本*/
Mat img_origin = imread(picture, IMREAD_COLOR);  // 读取一张彩色图
Mat img_copy = img_origin.clone();
  • 9
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值