OpenCV入門筆記(六) 輪廓檢測(Detect Contours)

來源:互聯網
上載者:User

標籤:python   opencv   

輪廓(Contours),指的是有相同顏色或者密度,串連所有連續點的一條曲線。檢測輪廓的工作對形狀分析和物體檢測與識別都非常有用。

在輪廓檢測之前,首先要對圖片進行二值化或者Canny邊緣檢測。在OpenCV中,尋找的物體是白色的,而背景必須是黑色的,因此圖片預先處理時必須保證這一點。

cv2.findContours函數

Python版樣本如下,也可以參考【OpenCV-Python教程(11、輪廓檢測)】【Contours : Getting Started】

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

完整例子:

import cv2#讀入圖片img = cv2.imread("1.png")# 必須先轉化成灰階圖gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINAEY)# 尋找輪廓contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 畫出輪廓,-1,表示所有輪廓,畫筆顏色為(0, 255, 0),即Green,粗細為3cv2.drawContours(img, contours, -1, (0, 255, 0), 3)# 顯示圖片cv2.namedWindow("Contours", cv2.NORMAL_WINDOW)cv2.imshow("Contours", img)# 等待鍵盤輸入cv2.waitKey(0)cv2.destroyAllWindows()

這裡的findContours函數,有三個參數

  • thresh -> 要尋找輪廓的圖片,注意這裡的輪廓會直接改變在thresh上,記得備份
  • cv2.RETR_TREE -> 表示輪廓檢索模式(Contour retrieval mode)為,檢索所有的輪廓,且重組為一個有層次的嵌套輪廓。層次資訊返回在hierarchy中。
  • cv2.CHAIN_APPROX_SIMPLE -> 表示輪廓近似方法(Contour approximation method)。SIMPLE可以這樣理解,假如一個矩形有1000個點,但是現在只用四個角的點表示就行了,即去掉冗餘資訊。

傳回值也有兩個,contourshierarchy

對contours的理解如下

print "找到 %d 個輪廓" %(len(contours))print "第 0 個輪廓有 %d 個點" %(len(contours[0]))# 畫出第0個輪廓cv2.drawContours(img, contours, 0, (0, 255, 0), 3)cv2.imshow("first contours", img)# 畫出第1個輪廓cv2.drawContours(img, contours, 1, (0, 255, 0), 3)cv2.imshow("second contours", img)# 畫出所有的輪廓cv2.drawContours(img, contours, -1, (0, 255, 0), 3)cv2.imshow("all contours", img)

對 hierarchy 的深究,可以參考這裡:【Contours Hierarchy】

輪廓特徵(Contour Features)

尋找到輪廓以後,我們可以得出輪廓的一些特徵資訊,也可以在輪廓上做一些簡單的操作,參考Python教程:【Contour Features】

1. 面積和周長樣本

# 尋找輪廓contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 取第 0 個輪廓cnt = contours[0]# 輪廓面積area = cv2.contourArea(cnt)# 周長,或者說,弧長;第二個參數的True表示該輪廓是否封閉perimeter = cv2.arcLength(cnt, True)

2. 輪廓近似

輪廓近似(Contour Approximation),要理解概念,先來看下面的三張圖。第一張是找到的輪廓;第二張近似的幅度很大,忽略了很多的細節;第三細節多一點.

OpenCV中是用 cv2.approxPolyDP()函數來進行輪廓的近似的。見代碼:

# 假設取第30個輪廓為例cnt = contours[30]# 10%,即0.1的精確度epsilon = 0.1 * cv2.arcLength(cnt, True)approx = cv2.approxPolyDP(cnt, epsilon, True)# 這裡是第二張,10%的精確度cv2.imshow("10% approximation", approx)

同理,第三張可以用1%的精確度來得到。

3. 計算凸包

涉及凸多面體和凹多面體的概念,不多解釋。如,本來是一個手掌的形狀,現在用最小的凸多面體把它包起來。其中,凸進去(Bulge Inside)的部分,稱為凸包缺陷(Convexity Defects),即箭頭處,即偏導的局部最大值處。

函數調用,以後用到再來細究吧!

hull = cv2.convexHull(cnt)cv2.imshow("hull", hull)

4. 矩形邊框

矩形邊框(Bounding Rectangle)是說,用一個最小的矩形,把找到的形狀包起來。還有一個帶旋轉的矩形,面積會更小,效果見

上代碼

# 用綠色(0, 255, 0)來畫出最小的矩形架構x, y, w, h = cv2.boundingRect(cnt)img = cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)# 用紅色表示有旋轉角度的矩形架構rect = cv2.minAreaRect(cnt)box = cv2.cv.boxPoints(rect)box = np.int0(box)img = cv2.drawContours(img, [box], 0, (0, 0, 255), 2)

PS其他的形狀,如 封閉的圓形橢圓直線 等,例子見這裡【Contour Features】,原理差不多,不再贅述。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

OpenCV入門筆記(六) 輪廓檢測(Detect Contours)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.