心路歷程
首先將圖片轉為灰調,再運用之前提到過的手法將圖片霧化處理,減少許多不是主要的輪廓,再透過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")
|
參考
Python-OpenCV — 讀取顯示及儲存影像、影片
Python-OpenCV — 影像運算及轉換
OpenCV Course - Full Tutorial with Python