1. 得到Mat類型img的size,可以使用函數img.size(),注意這里有括號。但是在需得到img的行和列時,不需要使用括號,即使用img.rows和img.cols.
2. 已經定義好了img為Mat型,但是沒有初始化,在后面程序的任何一個位置可以使用下面的代碼初始化img,比如img=Mat(***1,***2),其中***1是矩形區域的大小,***2是數組內數據類型。
3. 在opencv中像素點的數據類型能找到對應類似char,int,float,double的,比如說是分別為CV_8UC1,CV_16UC1,CV_32FC1, CV_64FC1,一定要注意是沒有這一說法的CV_16FC1。
4. 在對opencv工程進行debug時,如果想查看Mat型內部的數據,直接在變量監視器里面看是不行的,且觀察時其內部還有可能報錯。最好是將Mat類型數據cout到屏幕終端觀察。
5. 將一個vector類型的變量轉換成一個Mat型變量,可以采用下面的方法: Vector<Point>& c=contours(0);Mat cnew;Cnew=Mat(c);
6.Scalar與CvScalar類似,都是標量,用於存儲像素值的,有4個通道,每個通道可存double型,其內部定義為:
typedef struct CvScalar
{
double val[4];
}CvScalar;
7.當圖像像素值為hsv空間時,hsv中3個分量的取值范圍為[0 180],[0 255],[0,255].
8.opencv中的NAN表示是非數字,即Not A Number,INF表示無窮大,比如+INF:正無窮,-INF:負無窮。
9.RGB空間是類似人眼工作機制,被各種顯示設備采用。HSV,HLS是描述顏色更自然的方法,去掉最后一個元素可以使算法對光照不敏感。YCrCb在jpeg中廣泛使用。Lab是在感知上比較均勻的顏色空間,適合度量2個顏色之間的距離。
10.在使用zeros函數時,如果是用這個zeros(int rows, int cols, int type),注意第一個參數為rows,即圖像的高度。如果是用zeros(Size size, int type)而size又為Size(cols, rows),其第一個參數為cols,即圖像的寬度。即Mat大小先是高度然后是寬度,而size大小顯示寬度然后是高度。
11. Size wholeSize;
Point roiofs;
img.locateROI(wholeSize, roiofs);
locateROI在此處是如果img圖像是從其它父圖像中某一部分得來的,那么其父圖像221 的大小尺寸就為whleSize了,img圖像左上角那個點相對於父圖像的左上角位置就為點roiofs了。
12. 在opencv學習中,經常會讀一些基於1.0版本的opencv代碼,如果我們需要在2.0以后版本中使用已有的代碼,遇到的問題最多的就是Mat和IplImage*之間的轉換,現在舉個例子來簡單說明一下這2者之間的轉換。
假設已經定義: Mat src;
IplImage* img;
並且也假設src或者img中已經有了數據。則如果需要將src轉換到img,應該使用下面的語句:
img = &src.operator IplImage();
如果是將img轉換到src,則直接使用下面的語句:
src = Mat(img);
這是opencv基於c版本和c++版本混合編程的處理方法。
13. 在opencv的core.hpp里面有AutoBuffer<>()函數,該函數為自動分配一段指定大小的內存,並且可以指定內存中數據的類型。
14.調用Mat::copyTo()函數時,如果需要有mask操作,則不管源圖像是多少通道的,其mask矩陣都要定義為單通道,另外可以對一個mask矩陣畫一個填充的矩形來達到使mask矩陣中對應ROI的位置的值為設定值,這樣就不需要去一一掃描賦值了。
15. 在使用OpenCV的Mat矩陣且需要對該矩陣進行掃描時,一定要注意其取值順序,比如說列和行的順序,如果弄反了,則經常會報內存錯誤。
16. 在使用OpenCV內部的判斷條件時應該使用CV_Assert()函數,而不是CV_ASSERT()。
17. 通過實驗測試發現,雖然經過calcHist()函數計算過后的直方圖保存在hist中,這里hist是一個Mat類型,並且如果計算的是一維的直方圖的話,則hist是一個列向量。
18. 當Mat中數據的類型為CV_16UC1的時候,這里的16U並不是指unsigned int,而是指的是unsigned short int,因為在OpenCV框架中,int不是16位的,而是32位的。沒想到我使用OpenCV一年了,今天才弄清楚這個。
19. 坐標體系中的零點坐標為圖片的左上角,X軸為圖像矩形的上面那條水平線;Y軸為圖像矩形左邊的那條垂直線。該坐標體系在諸如結構體Mat,Rect,Point中都是適用的。(雖然網上有學着說OpenCV中有些數據結構的坐標原點是在圖片的左下角,但是我暫時還沒碰到過)。
20. 在使用image.at<TP>(x1, x2)來訪問圖像中點的值的時候,x1並不是圖片中對應點的x軸坐標,而是圖片中對應點的y坐標。因此其訪問的結果其實是訪問image圖像中的Point(x2, x1)點,即與image.at<TP>(Point(x2, x1))效果相同。
21. 如果所畫圖像是多通道的,比如說image圖像的通道數時n,則使用Mat::at(x, y)時,其x的范圍依舊是0到image的height,而y的取值范圍則是0到image的width乘以n,因為這個時候是有n個通道,所以每個像素需要占有n列。但是如果在同樣的情況下,使用Mat::at(point)來訪問的話,則這時候可以不用考慮通道的個數,因為你要賦值給獲取Mat::at(point)的值時,都不是一個數字,而是一個對應的n維向量。
22. 多通道圖像在使用minMaxLoc()函數是不能給出其最大最小值坐標的,因為每個像素點其實有多個坐標,所以是不會給出的。因此在編程時,這2個位置應該給NULL。