還沒看過前一篇的記得先看吶!!

心路歷程

首先將圖片轉為灰調,再運用之前提到過的手法將圖片霧化處理,減少許多不是主要的輪廓,再透過canny擷取圖片所有邊緣,最後利用contour來搜尋輪廓

細節

contour 中的 hierarchies為輪廓的階級,像是圓形中包含三角形之類的…

cv2.RETR_LIST會回傳圖片中的所有輪廓

cv2.CHAIN_APPROX_SIMPLE是決定我們要怎麼搜尋輪廓,而cv2.CHAIN_APPROX_SIMPLE會簡化輪廓

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import cv2
import numpy as np

img = cv2.imread('cat.jpg')
cv2.imshow('Cats', img)

blank = np.zeros(img.shape, dtype='uint8')
cv2.imshow('Blank', blank)

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray', gray)

blur = cv2.GaussianBlur(gray, (5,5), cv2.BORDER_DEFAULT)
cv2.imshow('Blur', blur)

canny = cv2.Canny(blur, 125, 175)
cv2.imshow('Canny Edges', canny)

contours, hierarchies = cv2.findContours(canny, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(f'{len(contours)} contour(s) found!')

cv2.drawContours(blank, contours, -1, (0,0,255), 1)
cv2.imshow('Contours Drawn', blank)

key = cv2.waitKey()
if key == ord("q"):
print("exit")

cv2.destroyWindow("windows")

參考

  1. Python-OpenCV — 讀取顯示及儲存影像、影片

  2. Python-OpenCV — 影像運算及轉換

  3. OpenCV Course - Full Tutorial with Python