findcontours函式,這個函式的原型為:
void findcontours(inputoutputarray image, outputarrayofarrays contours, outputarray hierar-
chy, int mode, int method, point offset=point())
引數說明
輸入影象image必須為乙個2值單通道影象
contours引數為檢測的輪廓陣列,每乙個輪廓用乙個point型別的vector表示
hiararchy引數和輪廓個數相同,每個輪廓contours[ i ]對應4個hierarchy元素hierarchy[ i ][ 0 ] ~hierarchy[ i ][ 3 ],分別表示後乙個輪廓、前乙個輪廓、父輪廓、內嵌輪廓的索引編號,如果沒有對應項,該值設定為負數。
mode表示輪廓的檢索模式
cv_retr_external表示只檢測外輪廓method為輪廓的近似辦法cv_retr_list檢測的輪廓不建立等級關係
cv_retr_ccomp建立兩個等級的輪廓,上面的一層為外邊界,裡面的一層為內孔的邊界資訊。如果內孔內還有乙個連通物體,這個物體的邊界也在頂層。
cv_retr_tree建立乙個等級樹結構的輪廓。具體參考contours.c這個demo
offset表示代表輪廓點的偏移量,可以設定為任意值。對roi影象中找出的輪廓,並要在整個影象中進行分析時,這個引數還是很有用的。
contourarea函式可以得到當前輪廓包含區域的大小,方便輪廓的篩選
findcontours經常與drawcontours配合使用,用來將輪廓繪製出來。其中第乙個引數image表示目標影象,第二個引數contours表示輸入的輪廓組,每一組輪廓由點vector構成,第三個引數contouridx指明畫第幾個輪廓,如果該引數為負值,則畫全部輪廓,第四個引數color為輪廓的顏色,第五個引數thickness為輪廓的線寬,如果為負值或cv_filled表示填充輪廓內部,第六個引數linetype為線型,第七個引數為輪廓結構資訊,第八個引數為maxlevel
得到了複雜輪廓往往不適合特徵的檢測,這裡再介紹乙個點集凸包絡的提取函式convexhull,輸入引數就可以是contours組中的乙個輪廓,返回外凸包絡的點集
還可以得到輪廓的外包絡矩形,使用函式boundingrect,如果想得到旋轉的外包絡矩形,使用函式minarearect,返回值為rotatedrect;也可以得到輪廓的外包絡圓,對應的函式為minenclosingcircle;想得到輪廓的外包絡橢圓,對應的函式為fitellipse,返回值也是rotatedrect,可以用ellipse函式畫出對應的橢圓
如果想根據多邊形的輪廓資訊得到多邊形的多階矩,可以使用類moments,這個類可以得到多邊形和光柵形狀的3階以內的所有矩,類內有變數m00,m10,m01,m20,m11,m02,m30,m21,m12,m03,比如多邊形的質心為 x = m10 / m00,y = m01 / m00。
如果想獲得一點與多邊形封閉輪廓的資訊,可以呼叫pointpolygontest函式,這個函式返回值為該點距離輪廓最近邊界的距離,為正值為在輪廓內部,負值為在輪廓外部,0表示在邊界上。
**:
FindContours 函式崩潰問題探索
首先介紹下這個函式 演算法 對於第一種錯誤 屬於引數型別不匹配,輸入影象image必須為乙個2值單通道影象。第二個引數 contours引數為檢測的輪廓數,vector contoursm,網上說必須為cv vector和cv point 但其實opencv中vector指向的就是std 中的vec...
findContours函式引數說明及相關函式
findcontours函式,這個函式的原型為 void findcontours inputoutputarray image,outputarrayofarrays contours,outputarray hierar chy,int mode,int method,point offset ...
opencv中的findContours的使用
1.findcontours對0包圍1的情況,會找出1來。例如 0,0,0 0,1,0 0,0,0 找出來的contour是1,1.2.findcontours對1包圍0的情況,會找出0周圍的點來。1,1,1 1,0,1 1,1,1 找出來的contour是1,0 2,1 1,2 0,1 3.fin...