opencv尋找輪廓 繪製輪廓 輪廓層級原理

2021-09-24 14:41:52 字數 2582 閱讀 5713

void findcontours( inputoutputarray image, outputarrayofarrays contours,

outputarray hierarchy, int mode,

int method, point offset = point());

引數image:inputarray型別的輸入影象,填mat類的物件即可,要是二值圖

引數contours:檢測到的輪廓,函式呼叫後的結果存放在這裡,每個輪廓儲存為乙個點向量,用point型別的vector表示:

vector> contours;

裡面的容器代表乙個輪廓的每個點,外面的容器代表的每個輪廓

引數hierarchy:是可選的輸出向量,包含了影象的拓撲資訊。其作為輪廓數量的表示,包含了許多元素。每個輪廓contours[i]對應4個hierarchy元素:

hierarchy[i][0],hierarchy[i][1],hierarchy[i][2],hierarchy[i][3]

分別表示後乙個輪廓,前乙個輪廓,子輪廓,父輪廓 的索引編號,如果沒有對應項,

則對應的hierarchy[i]值設定為負值。

可表示為: vectorhierarchy;

引數mode:輪廓的檢索模式。

①retr_external:只檢測最外的輪廓,對於所以輪廓都設定為

hierarchy[i][2] = hierarchy[i][3] = -1

②retr_list:將檢測到的所有輪廓放在list中,輪廓不建立等級關係(也就沒有子,父輪廓)

③retr_ccomp:將檢測到的所有輪廓分成兩個等級,頂層是外部輪廓,

第二層是孔洞的內部輪廓,如果內部輪廓裡面還有輪廓,那麼裡面的輪廓歸屬於頂層輪廓

④rete_tree:將檢測到的所有輪廓按照等級樹歸分

***後面三種幾乎都可以檢測出全部輪廓,只是順序不一樣***

引數method:為輪廓的近似方法

即max(abs(x1 - x2), abs(y2 - y1)) == 1

(即儲存所有連續的輪廓點到contours向量內)

例如矩形輪廓只要四個頂點

(即僅僅儲存輪廓的拐點,存入contours向量內)

引數offset:point偏移量,所有的輪廓資訊相對於原始影象對應點的偏移量

如圖中有0,1,2,3,4這四個輪廓,這個序號是我隨意編寫,在程式中findcontours()函式會自動尋找標記,這也是輪廓檢索的序號,序號從0~(n-1)。

以mode:retr_tree模式為例講解:

後乙個輪廓,前乙個輪廓的概念是同級的

1.圖中0號沒有後乙個,前乙個輪廓,父輪廓,有子輪廓1,3,按照序號的順序,優先選擇子輪廓1,所以表達方式是:hierarchy[-1,-1,1,-1] (-1代表沒有對應的輪廓)

2.圖中1號按照序號的順序,3號是它的後乙個輪廓,沒有前乙個輪廓,有子輪廓2號,父輪廓0號,所以表達方式是:hierarchy[3,-1,2,0]

3.圖中2號沒有後乙個,前乙個,以及子輪廓,有父輪廓1號,表示為hierarchy[-1,-1,-1,1]

4.圖中3號沒有後乙個輪廓,有前乙個輪廓1號,子輪廓4號,父輪廓0號,所以表示為

hierarchy[-1,1,4,0];

5.圖中4號沒有後乙個,前乙個,以及子輪廓,有父輪廓3號,表示為hierarchy[-1,-1,-1,3]

void drawcontours( inputoutputarray image, inputarrayofarrays contours,

int contouridx, const scalar& color,

int thickness = 1, int linetype = line_8,

inputarray hierarchy = noarray(),

int maxlevel = int_max, point offset = point() );

引數image:目標影象;

引數contours:所有的輸入輪廓;

引數contouridx:表示繪製第幾個輪廓,當為負值表示繪製全部輪廓;

引數color:繪製顏色;

引數thickness:繪製粗細,為負值則繪製在輪廓內部;

引數linetype:線的型別;

引數hierarchy:可選的層次結構資訊,預設mat();

引數maxlevel:表示用於繪製輪廓的最大等級;

引數offset:偏移引數。

OpenCV中的輪廓發現和輪廓繪製

實現 import cv2 import numpy as np 輪廓發現和輪廓繪製 img是一張與binary類似的二值圖,contours是list列表結構每個元素包含乙個邊沿資訊,heriachy是乙個矩陣,用處作者也未知,可以 contours,heriachy cv2.findcontou...

opencv 20 輪廓查詢與繪製

輪廓可以簡單認為成將連續的點 連著邊界 連在一起的曲線,具有相同的顏色或者灰度,提取輪廓就是提取這些具有相同顏色或者灰度的曲線,或者說是連通域,輪廓在形狀分析和物體的檢測和識別中非常有用。為了更加準確,要使用二值化影象。在尋找輪廓之前,要進行閾值化處理或者 canny 邊界檢測 查詢輪廓的函式會修改...

Opencv之外形輪廓繪製

相關理論知識 相關程式 include stdafx.h 本節講述 影象處理之 輪廓發現 include include include using namespace std using namespace cv void contours demo int void mat src,test1,...