輪廓(Contours),指的是有相同顏色或者密度,連接所有連續點的一條曲線。檢測輪廓的工作對形狀分析和物體檢測與識別都非常有用。
在輪廓檢測之前,首先要對圖片進行二值化或者Canny邊緣檢測。在OpenCV中,尋找的物體是白色的,而背景必須是黑色的,因此圖片預處理時必須保證這一點。
cv2.findContours函數
Python版示例如下,也可以參考【OpenCV-Python教程(11、輪廓檢測)】【Contours : Getting Started】
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
1. 完整例子
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
2. 參數解釋
這里的findContours
函數,有三個參數
- thresh -> 要尋找輪廓的圖片,注意這里的輪廓會直接改變在thresh上,記得備份
- cv2.RETR_TREE -> 表示輪廓檢索模式(Contour retrieval mode)為,檢索所有的輪廓,且重組為一個有層次的嵌套輪廓。層次信息返回在hierarchy中。
- cv2.CHAIN_APPROX_SIMPLE -> 表示輪廓近似方法(Contour approximation method)。SIMPLE可以這樣理解,假如一個矩形有1000個點,但是現在只用四個角的點表示就行了,即去掉冗余信息。
返回值也有兩個,contours
?和?hierarchy
對contours的理解如下
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
對 hierarchy 的深究,可以參考這里:【Contours Hierarchy】
輪廓特征(Contour Features)
查找到輪廓以后,我們可以得出輪廓的一些特征信息,也可以在輪廓上做一些簡單的操作,參考Python教程:【Contour Features】
1. 面積和周長示例
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2. 輪廓近似
輪廓近似(Contour Approximation),要理解概念,先來看下面的三張圖。第一張是找到的輪廓;第二張近似的幅度很大,忽略了很多的細節;第三細節多一點.
OpenCV中是用 cv2.approxPolyDP()函數來進行輪廓的近似的。見代碼:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
同理,第三張可以用1%的精確度來得到。
3. 計算凸包
涉及凸多面體和凹多面體的概念,不多解釋。如下圖,本來是一個手掌的形狀,現在用最小的凸多面體把它包起來。其中,凸進去(Bulge Inside)的部分,稱為凸包缺陷(Convexity Defects),即箭頭處,即偏導的局部最大值處。
函數調用,以后用到再來細究吧!
- 1
- 2
- 1
- 2
4. 矩形邊框
矩形邊框(Bounding Rectangle)是說,用一個最小的矩形,把找到的形狀包起來。還有一個帶旋轉的矩形,面積會更小,效果見下圖
上代碼
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
PS:其他的形狀,如?封閉的圓形
,橢圓
,直線
?等,例子見這里【Contour Features】,原理差不多,不再贅述。