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不僅拷貝了矩 陣元素值,還復制了矩陣的一些其他信息。它們是所謂的“深拷貝”。