我們接續上章寫完取絕對值步驟的程式碼:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
img1 = cap.read()[1]
img2 = cap.read()[1]
# 彩色圖轉灰階圖
gray1 = cv2.cvtColor(t0, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(t1, cv2.COLOR_BGR2GRAY)
# 高斯模糊化處理
blur1 = cv2.GaussianBlur(grey1,(5,5),0)
blur2 = cv2.GaussianBlur(grey2,(5,5),0)
result = cv2.absdiff(blur1, blur2)
如果想讓做完cv2.absdiff
之後的結果更加清楚,首先要用之前章節說過的二值化函式cv2.threshold
把result
重新賦值一遍:
ret, th = cv2.threshold(result, 15, 255, cv2.THRESH_BINARY)
如果忘記cv2.threshold
函式的作用,這裡再簡單解釋一遍:它能夠將灰階圖片依照門檻值參數劃分成黑白二色,如上面程式碼——色階大於15的元素賦值255,色階小於15則賦值0。
再執行一次cv2.imshow
,印出的結果只會剩下黑白二色,移動的輪廓也更加清晰了。
接著我們可以用OpenCV
的膨脹函數cv2.dilate
把二值化後的圖片進行輪廓加強處理:
dilated = cv2.dilate(th, None, iterations=1)
把二值化和膨脹化之後的圖片一起印出來看看,會看到膨脹之後圖片的輪廓比二值化圖片的輪廓粗大了一些,這就是cv2.dilate
的作用。
經過這些後續處理之後,最後的結果和只用cv2.absdiff
處理的圖片對比起來是不是差了很多!
以後如果在寫動態捕捉程式的時候覺得抓到的輪廓太黯淡的話,記得別忘了二值化和膨脹化的步驟哦!