總結系列 5 opencv知識點,續

2021-06-23 03:43:22 字數 2855 閱讀 2351

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& c=contours(0);mat cnew;cnew=mat(c);    

6.scalar與cvscalar類似,都是標量,用於儲存畫素值的,有4個通道,每個通道可存double型,其內部定義為:

typedef  struct cvscalar

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(x1, x2)來訪問影象中點的值的時候,x1並不是中對應點的x軸座標,而是中對應點的y座標。因此其訪問的結果其實是訪問image影象中的point(x2, x1)點,即與image.at(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。

總結系列 5 opencv知識點,續

1.得到mat型別img的size,可以使用函式img.size 注意這裡有括號。但是在需得到img的行和列時,不需要使用括號,即使用img.rows和img.cols.2.已經定義好了img為mat型,但是沒有初始化,在後面程式的任何乙個位置可以使用下面的 初始化img,比如img mat 1,2...

OpenCV知識點總結

mat 是乙個類,由兩個資料部分組成 矩陣頭 包含矩陣尺寸,儲存方法,儲存位址等資訊 和乙個指向儲存所有畫素值的矩陣 根據所選儲存方法的不同矩陣可以是不同的維數 的指標。矩陣頭的尺寸是常數值,但矩陣本身的尺寸會依影象的不同而不同,通常比矩陣頭的尺寸大數個數量級。因此,當在程式中傳遞影象並建立拷貝時,...

OpenCV知識點記錄

關鍵字前帶cv的都是c裡的寫法,不帶cv的是c 裡的寫法,比如cvrng和rng,其本質都是一樣的。計算機產生的隨機數都是偽隨機數,是根據種子seed和特定演算法計算出來的。所以,只要種子一定,演算法一定,產生的隨機數是相同的 要想產生完全重複的隨機數,可以用系統時間做種子。opencv中用gett...