OpenCV图像拷贝方法与注意点(=、copy、clone)
2017-04-07 16:09:57 GroupHuang 阅读数 9106更多
分类专栏: OpenCV
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MengchiCMC/article/details/69568469
下面介绍三种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();