opencv實用技巧總結!(後續會補充)

2021-07-23 15:05:08 字數 2619 閱讀 5796

1.已經定義好了img為mat型,但是沒有初始化,在後面程式的任何乙個位置可以使用下面的**初始化img,比如img=mat(***1,***2),其中***1是矩形區域的大小,***2是陣列內資料型別。

2.在opencv中畫素點的資料型別能找到對應類似char,int,float,double的,比如說是分別為cv_8uc1,cv_16uc1,cv_32fc1, cv_64fc1,一定要注意是沒有這一說法的cv_16fc1。

3.在對opencv工程進行debug時,如果想檢視mat型內部的資料,直接在變數監視器裡面看是不行的,且觀察時其內部還有可能報錯。最好是將mat型別資料cout到螢幕終端觀察。

4.將乙個vector型別的變數轉換成乙個mat型變數,可以採用下面的方法: vector& c=contours(0);mat cnew;cnew=mat(c);  

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

typedef 

struct cvscalar

cvscalar;

6.當影象畫素值為hsv空間時,hsv中3個分量的取值範圍為[0 180],[0 255],[0,255].

7.opencv中的nan表示是非數字,即not a number,inf表示無窮大,比如+inf:正無窮,-inf:負無窮。 

8.rgb空間是類似人眼工作機制,被各種顯示裝置採用。hsv,hls是描述顏色更自然的方法,去掉最後乙個元素可以使演算法對光照不敏感。ycrcb在jpeg中廣泛使用。lab是在感知上比較均勻的顏色空間,適合度量2個顏色之間的距離。

size wholesize;

point roiofs;

img.locateroi(wholesize, roiofs);

locateroi在此處是如果img影象是從其它父影象中某一部分得來的,那麼其父影象的大小尺寸就為whlesize了,img影象左上角那個點相對于父影象的左上角位置就為點roiofs了。

9. 在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++版本混合程式設計的處理方法。

10. 在opencv的core.hpp裡面有autobuffer<>()函式,該函式為自動分配一段指定大小的記憶體,並且可以指定記憶體中資料的型別。

11.呼叫mat::copyto()函式時,如果需要有mask操作,則不管源影象是多少通道的,其mask矩陣都要定義為單通道,另外可以對乙個mask矩陣畫乙個填充的矩形來達到使mask矩陣中對應roi的位置的值為設定值,這樣就不需要去一一掃瞄賦值了。

12.在使用opencv的mat矩陣且需要對該矩陣進行掃瞄時,一定要注意其取值順序,比如說列和行的順序,如果弄反了,則經常會報記憶體錯誤。

13.在使用opencv內部的判斷條件時應該使用cv_assert()函式,而不是cv_assert()。

14.通過實驗測試發現,雖然經過calchist()函式計算過後的直方圖儲存在hist中,這裡hist是乙個mat型別,並且如果計算的是一維的直方圖的話,則hist是乙個列向量。

15. 

當mat中資料的型別為cv_16uc1的時候,這裡的16u並不是指unsigned int,而是指的是unsigned short int,因為在opencv框架中,int不是16位的,而是32位的。沒想到我使用opencv一年了,今天才弄清楚這個。

16. 座標體系中的零點座標為的左上角,x軸為影象矩形的上面那條水平線;y軸為影象矩形左邊的那條垂直線。該座標體系在諸如結構體mat,rect,point中都是適用的。(雖然網上有學著說opencv中有些資料結構的座標原點是在的左下角,但是我暫時還沒碰到過)。

17. 在使用image.at(x1, x2)來訪問影象中點的值的時候,x1並不是中對應點的x軸座標,而是中對應點的y座標。因此其訪問的結果其實是訪問image影象中的point(x2, x1)點,即與image.at(point(x2, x1))效果相同。

18. 如果所畫圖像是多通道的,比如說image影象的通道數時n,則使用mat::at(x, y)時,其x的範圍依舊是0到image的height,而y的取值範圍則是0到image的width乘以n,因為這個時候是有n個通道,所以每個畫素需要占有n列。但是如果在同樣的情況下,使用mat::at(point)來訪問的話,則這時候可以不用考慮通道的個數,因為你要賦值給獲取mat::at(point)的值時,都不是乙個數字,而是乙個對應的n維向量。

19. 多通道影象在使用minmaxloc()函式是不能給出其最大最小值座標的,因為每個畫素點其實有多個座標,所以是不會給出的。因此在程式設計時,這2個位置應該給null。

20.使用霍夫變換時,檢測的直線有時候可能不是水平的,為了保持水平或者是豎直,可以使用if函式保證lines陣列的第乙個與第三個,第二個與第四個其中某一對數值相等。

vartical align實用技巧總結

vartical align的用法非常複雜,但是非常強大,下面介紹一些實用技巧。首先w3c官方對vartical align屬性的定義有四個方面 1 vartical align屬性用於定義 周圍的文字 inline元素 以及inline block元素 相對於該元素基線的垂直對齊方式。這裡的該元素...

vue實用技巧總結

總結一些新手可能會迷惑但是專案中常用的小技巧 給元件繫結原生事件 對於一般的html元素,繫結自定義事件使用v on即可,但是在某個元件的根元素上監聽乙個原生事件,比如 我們會發現這樣是不起作用的,可以使用.native修飾 其實它不過是下面示例的簡寫 所以在自定義元件上也可以使用v model 相...

Linux 實用技巧

值得一提的是vim是慈善軟體 charityware 如有贊助或評比得獎,所得將全部救助烏干達孤兒,軟體使用是免費的,歡迎手頭有點閒錢的使用者捐款贊助,如果沒銀子也沒關係,至少當有評比活動時 有獎金可拿的那種 應用技巧一 快速注釋 1 連續行注釋 使用vim vi編輯shell指令碼,在進行除錯的時...