opencv3編程入門——學習筆記(4)基礎圖像容器Mat類

上一篇文字裏面其實還有個小坑。如果真的像我說的代碼是自己敲的話就能發現。在代碼的第35行有 srcImage.copyTo(tempImage);//複製源圖到臨時變量  的代碼。其中.copyto()解釋說是複製源圖到一個臨時變量。這裏不知道大家有沒有疑問。按照C語言的思想直接讓scrImage = tempImage;不就好了嘛。非也,非也。正式因爲這是C語言的思想。而咱們的代碼是C++寫的,可還是有區別滴。具體什麼區別我們需要從Mat類開始講起。話說。。。。
我們不去考慮opencv1.x的舊版本的歷史問題。我們就說Mat類。大家知道自opencv2.0以來,我們opencv的接口就成了C++。在C++中提供了一個類的概念。方便了編程人員在使用一個矩陣(其實就是用來存儲圖片的一個變量)時,用完後不用去手工釋放空間。同時大也明白圖像運算的一些算法什麼的計算量那是相當大的。這也就意味着十分消耗資源。爲了解決這個問題。OPENCV2中就定義Mat類。來先看看Mat累的構成:一、矩陣頭(裏面包含了矩陣的大小、存儲方式、存儲地址等信息);二、一個指針。這個指針指向真正存着各個像素的數值的矩陣。有什麼好處呢?看代碼說話。
Mat A, C;//僅僅創建信息頭部分
A = imread("1.jpg",CV_LOAD_IMAGE_COLOR);//這裏爲矩陣開闢內存.
Mat B(A);//使用複製構造函數
C = A;//複製運算符

這些代碼裏A,B,C都是一個Mat類對象。這些對象的信息頭不一樣,但是他們最終指向的其實都是內存中同一個矩陣。不同的對象實際上只是通過不同方式訪問了相同的數據而已。這也意味着如果我們改變其中某一個Mat類對象的像素值,那麼其餘的也會改變。

所以呀,如果需要真真正正地、完完全全地複製一個Mat類。不要使用賦值語句,也不要使用複製構造語句。而應該使用的是:

Mat F = A.clone();

Mat G;

A.copyTo(G);

現在改變F,或者G就不會影響A了。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章