opnCV 学习博客
http://blog.csdn.net/thefutureisour/article/details/7472104
1 OpneCV中的数据共享机制
OpenCV是一个很不错的开源计算机视觉库。我自己已经玩了一段时间了,决定把一些学习成果整理出来,分享给大家。学习OpenCV最好的助手当 然是opencv自带的手册和教程了。手册是英文版的,方便查找函数。教程有部分是中文版的,也有一部分没有汉化。可以通过网址:http://www.opencv.org.cn/opencvdoc/2.3.2/html/index.html查看。
这次主要是想说一个opencv中的数据共享机制。先看程序:

1 #include <opencv2/core/core.hpp> 2 #include <opencv2/highgui/highgui.hpp> 3 #include <opencv2/imgproc/imgproc.hpp> 4 5 using namespace cv; 6 7 //测试引用计数方面的问题 8 int main() 9 { 10 Mat image = imread("D:/picture/img.tif"); 11 imshow("读入的图片",image); 12 13 Mat result = image; 14 //result = image.clone(); 15 //image.copyTo(result); 16 17 //滤波程序 18 blur(image,image,Size(7,7)); 19 imshow("结果图片",result); 20 21 waitKey(0); 22 return 0; 23 }
程序做了一下几件事情:读入图片image,将image于result关联起来。OpenCV中一个重要的特点就是你不必事先指定图像的长、宽、像素深 度等信息,库函数会自动帮你完成。然后对image图像进行滤波,显示滤波以后result图像的结果(注意:不是image的结果)。
对于图像result,程序中提供3种方式与图像image关联:第一种是是用“=”,第二种是用copyTo,第三种使用clone。运行代码 可以发现:当使用“=”时,对image的滤波会导致result的图像改变;而使用clone或者copyTo不会引起result的改变。
原因是什么呢?因为使用“=”时,并没有复制新的数据,而只是让result指向image。它们指向的是内存中的同一份数据。等号操作以 后,image的引用计数+1而已。这就是所谓的“浅拷贝”。而copyTo则是把矩阵的每个元素都重新拷贝给了result。copyTo不仅拷贝了矩 阵元素值,还复制了矩阵的一些其他信息。它们是所谓的“深拷贝”。