iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 28
1

我們接續上章寫完取絕對值步驟的程式碼:

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.thresholdresult重新賦值一遍:

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處理的圖片對比起來是不是差了很多!

以後如果在寫動態捕捉程式的時候覺得抓到的輪廓太黯淡的話,記得別忘了二值化和膨脹化的步驟哦!


上一篇
Day27-移動偵測1
下一篇
Day29-影像侵蝕
系列文
OpenCV 從零開始的影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言