我的OpenCV学习笔记(一):OpneCV中的数据共享机制

来源:互联网 发布:卡尔曼滤波算法库 编辑:程序博客网 时间:2024/05/22 17:42

OpenCV是一个很不错的开源计算机视觉库。我自己已经玩了一段时间了,决定把一些学习成果整理出来,分享给大家。学习OpenCV最好的助手当然是opencv自带的手册和教程了。手册是英文版的,方便查找函数。教程有部分是中文版的,也有一部分没有汉化。可以通过网址:http://www.opencv.org.cn/opencvdoc/2.3.2/html/index.html查看。

这次主要是想说一个opencv中的数据共享机制。先看程序:

 

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;//测试引用计数方面的问题int main(){Mat image = imread("D:/picture/img.tif");imshow("读入的图片",image);Mat result = image;//result = image.clone();//image.copyTo(result);//滤波程序blur(image,image,Size(7,7));imshow("结果图片",result);waitKey(0);return 0;}


程序做了一下几件事情:读入图片image,将image于result关联起来。OpenCV中一个重要的特点就是你不必事先指定图像的长、宽、像素深度等信息,库函数会自动帮你完成。然后对image图像进行滤波,显示滤波以后result图像的结果(注意:不是image的结果)。

 对于图像result,程序中提供3种方式与图像image关联:第一种是是用“=”,第二种是用copyTo,第三种使用clone。运行代码可以发现:当使用“=”时,对image的滤波会导致result的图像改变;而使用clone或者copyTo不会引起result的改变。

原因是什么呢?因为使用“=”时,并没有复制新的数据,而只是让result指向image。它们指向的是内存中的同一份数据。等号操作以后,image的引用计数+1而已。这就是所谓的“浅拷贝”。而copyTo则是把矩阵的每个元素都重新拷贝给了result。copyTo不仅拷贝了矩阵元素值,还复制了矩阵的一些其他信息。它们是所谓的“深拷贝”。