一、概括
理解物體形狀或輪廓的另外一種有用的方法是計算乙個物體的凸包(convex hull)然後計算其凸缺陷(convexity defects)。很多複雜物體的特性能很好的被這種缺陷表現出來。
二、相關函式
1、發現點集的凸外形
cvseq* cvconvexhull2( const cvarr* input, void* hull_storage=null,
int orientation=cv_clockwise,
int return_points=0 );
points
2d 點集的序列或陣列,32-位元整數或浮點數座標
hull_storage
輸出的陣列(cvmat*) 或記憶體快取 (cvmemstorage*),用以儲存凸外形。 如果是陣列,則它應該是一維的,而且與輸入的陣列/序列具有同樣數目的元素。輸出時,通過修改頭結構將陣列裁減到凸外形的尺寸。
orientation
凸外形的旋轉方向: 逆時針或順時針 (cv_clockwise or cv_counter_clockwise)
return_points
如果非零,hull_storage 為陣列情況下,點集將以外形 (hull) 儲存,而不是頂點形式 (indices)。如果 hull_storag 為記憶體儲存模式下則儲存為點集形式(points)。
函式 cvconvexhull2 使用 sklansky 演算法計算 2d 點集的凸外形。如果 hull_storage 是記憶體儲存倉, 函式根據 return_points 的值,建立乙個包含外形的點集或指向這些點的指標的序列。
2、測試輪廓的凸性
int cvcheckcontourconvexity( const cvarr* contour );
contour
被測試輪廓 (點序列或陣列).
函式 cvcheckcontourconvexity 輸入的輪廓是否為凸的。必須是簡單輪廓,比如沒有自交叉。
3、發現輪廓凸形缺陷
cvseq* cvconvexitydefects( const cvarr* contour, const cvarr* convexhull,
cvmemstorage* storage=null );
contour
輸入輪廓
convexhull
用 cvconvexhull2 得到的凸外形,它應該包含輪廓的定點的指標或下標,而不是外形點的本身,即cvconvexhull2 中的引數 return_points 應該設定為 0.
storage
凸性缺陷的輸出序列容器。如果為 null, 使用輪廓或外形的儲存倉。
函式 cvconvexitydefects 發現輸入輪廓的所有凸性缺陷,並且返回 cvconvexitydefect 結構序列。
輪廓和凸包
注意,findcontous接受的是二值圖 函式返回三個引數,第乙個image,第二個是contours輪廓資訊,第三個是層析結構 image,contours,hierarchy cv2.findcontours thresh,2,1 print contours type type contou...
opencv 根據模板凸包求閾值化後的輪廓組合
影象處理中,要求特徵與背景的對比度高,同時,合適的影象分割也是解決問題的關鍵。博主以前的方法,預設為特徵必然是最大的連通域,所以閾值化後,查詢輪廓,直接提取面積最大的輪廓即可。但可能會存在另一種情況,不論怎麼閾值化和膨脹,想要的特徵被分成好幾塊,也即斷開了。此時,再加上一些不可 的干擾和雜訊,fin...
opencv 輪廓描述
上午主要學習了鏈碼的有關知識,鏈碼是一種表示方法,是用於表示有順序連線的具有指定長度了方向的直線段組成的邊界線,典型的情況下,這種表示方法基於4或8連線,經常選用更大間隔的網格對邊界進行重取樣,邊界的鏈碼取決於初始點,然而,此編碼可以通過簡單的過程實現初始點的歸一化,將鏈碼看成是方向編號的迴圈序列,...