天天看點

OpenCV findContours函數

findContours()函數

函數功能

函數原型

參數說明

測試:mode與method取值問題

檢測最外層輪廓,并且儲存輪廓上所有點

檢測所有輪廓,但各輪廓之間彼此獨立,不建立等級關系,并且僅儲存輪廓上拐點資訊

檢測所有輪廓,輪廓間建立外層、内層的等級關系,并且儲存輪廓上所有點

Point()偏移量設定

檢測出物體的輪廓

<code>image</code>:單通道圖像矩陣,可以是灰階圖,但更常用的是二值圖像,一般是經過Canny、拉普拉斯等邊緣檢測算子處理過的二值圖像;

<code>contours</code>:contours定義為“vector&lt;vector&gt; contours”,是一個雙重向量(向量内每個元素儲存了一組由連續的Point構成的點的集合的向量),每一組點集就是一個輪廓,有多少輪廓,contours就有多少元素;

<code>hierarchy</code>:hierarchy定義為“<code>vector&lt;Vec4i&gt; hierarchy</code>”,Vec4i的定義:<code>typedef Vec&lt;int, 4&gt; Vec4i;</code>(向量内每個元素都包含了4個int型變量),是以從定義上看,hierarchy是一個向量,向量内每個元素都是一個包含4個int型的數組。向量hierarchy内的元素和輪廓向量contours内的元素是一一對應的,向量的容量相同。hierarchy内每個元素的4個int型變量是<code>hierarchy[i][0] ~ hierarchy[i][3]</code>,分别表示目前輪廓 i 的後一個輪廓、前一個輪廓、父輪廓和内嵌輪廓的編号索引。如果目前輪廓沒有對應的後一個輪廓、前一個輪廓、父輪廓和内嵌輪廓,則相應的<code>hierarchy[i][*]</code>被置為-1。

<code>mode</code>:定義輪廓的檢索模式,取值如下:

<code>method</code>:定義輪廓的近似方法,取值如下:

<code>offset</code>:Point偏移量,所有的輪廓資訊相對于原始圖像對應點的偏移量,相當于在每一個檢測出的輪廓點上加上該偏移量,并且Point還可以是負值!

通過調整第四個參數mode——輪廓的檢索模式、第五個參數method——輪廓的近似方式和不同的偏移量Point(),就可以得到不同效果。

一、mode取值“CV_RETR_EXTERNAL”,method取值“CV_CHAIN_APPROX_NONE”,即隻檢測最外層輪廓,并且儲存輪廓上所有點:

輪廓:

OpenCV findContours函數

隻有最外層的輪廓被檢測到,内層的輪廓被忽略

contours向量内所有點集:

OpenCV findContours函數

儲存了所有輪廓上的所有點,圖像表現跟輪廓一緻

hierarchy向量:

OpenCV findContours函數

重溫一下hierarchy向量————向量中每個元素的4個整形分别對應目前輪廓的後一個輪廓、前一個輪廓、父輪廓、内嵌輪廓的索引編号。

本次參數配置下,hierarchy向量内有3個元素,分别對應于3個輪廓。以第2個輪廓(對應向量内第1個元素)為例,

内容為[2,0,-1,-1], “2”表示目前輪廓的後一個輪廓的編号為2,“0”表示目前輪廓的前一個輪廓編号為0,其後2個“-1”表示為空,因為隻有最外層輪廓這一個等級,是以不存在父輪廓和内嵌輪廓。

二、 mode取值“CV_RETR_LIST”,method取值“CV_CHAIN_APPROX_SIMPLE”,即檢測所有輪廓,但各輪廓之間彼此獨立,不建立等級關系,并且僅儲存輪廓上拐點資訊:

OpenCV findContours函數

檢測到的輪廓跟上文“一”中是一緻的,不再顯示。

OpenCV findContours函數

contours向量中所有的拐點資訊得到了保留,但是拐點與拐點之間直線段的部分省略掉了。

hierarchy向量(截取一部分):

OpenCV findContours函數

本次參數配置下,檢測出了較多輪廓。第1、第2個整形值分别指向上一個和下一個輪廓編号,由于本次配置mode取值“<code>RETR_LIST</code>”,各輪廓間各自獨立,不建立等級關系,是以第3、第4個整形參數為空,設為值-1。

三、mode取值“CV_RETR_TREE”,method取值“CV_CHAIN_APPROX_NONE”,即檢測所有輪廓,輪廓間建立外層、内層的等級關系,并且儲存輪廓上所有點。

OpenCV findContours函數
OpenCV findContours函數

所有内外層輪廓都被檢測到,contours點集組成的圖形跟輪廓表現一緻。

hierarchy向量(截取一部分)

OpenCV findContours函數

本次參數配置要求檢測所有輪廓,每個輪廓都被劃分等級,最外圍、第一内圍、第二内圍等等,是以除第1個最後一個輪廓外,其他輪廓都具有不為-1的第3、第4個整形參數,分别指向目前輪廓的父輪廓、内嵌輪廓索引編号。

使用三中的參數配置,設定偏移量<code>Point</code>為<code>Point(45,30)</code>。

此時輪廓圖像為:

OpenCV findContours函數
OpenCV findContours函數

可以看到輪廓圖像整體向右下角有一個偏轉,偏轉量就是設定的(45,30)。

這個偏移量的設定不能過大或過小(負方向上的過小),若圖像上任一點加上該偏移量後超出圖像邊界,程式會記憶體溢出報錯。

OpenCV findContours函數

另外,繪制輪廓的函數drawContours中最後一個參數是一個Point類型的offset,這個offset跟findContours函數中的offset含義一緻,設定之後所繪制的輪廓是原始輪廓上所有像素點加上該偏移量offset後的效果。

當所分析圖像是另外一個圖像的ROI的時候,這個offset偏移量就可以大顯身手了。通過加減這個偏移量,就可以把ROI圖像的檢測結果投影到原始圖像對應位置上。

繼續閱讀