#最基本的運動檢測 計算幀之間的差異,或者考慮背景幀與其他幀之間的差異
import cv2
import numpy as np
camera = cv2.VideoCapture(0) # 參數0表示第一個攝像頭
# 判斷視頻是否打開
if (camera.isOpened()):
print('Open')
else:
print('攝像頭未打開')
# 測試用,查看視頻size
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print('size:'+repr(size))
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (9, 4))
kernel = np.ones((5, 5), np.uint8)
background = None
while True:
# 讀取視頻流
grabbed, frame_lwpCV = camera.read()
# 對幀進行預處理,先轉灰度圖,再進行高斯濾波。
# 用高斯濾波進行模糊處理,進行處理的原因:每個輸入的視頻都會因自然震動、光照變化或者攝像頭本身等原因而產生噪聲。對噪聲進行平滑是為了避免在運動和跟蹤時將其檢測出來。
gray_lwpCV = cv2.cvtColor(frame_lwpCV, cv2.COLOR_BGR2GRAY)
gray_lwpCV = cv2.GaussianBlur(gray_lwpCV, (21, 21), 0)
# 將第一幀設置為整個輸入的背景
if background is None:
background = gray_lwpCV
continue
# 對于每個從背景之后讀取的幀都會計算其與北京之間的差異,并得到一個差分圖(different map)。
# 還需要應用閾值來得到一幅黑白圖像,并通過下面代碼來膨脹(dilate)圖像,從而對孔(hole)和缺陷(imperfection)進行歸一化處理
diff = cv2.absdiff(background, gray_lwpCV)
diff = cv2.threshold(diff, 25, 255, cv2.THRESH_BINARY)[1] # 二值化閾值處理
diff = cv2.dilate(diff, es, iterations=2) # 形態學膨脹
# 顯示矩形框
image, contours, hierarchy = cv2.findContours(diff.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 該函數計算一幅圖像中目標的輪廓
for c in contours:
if cv2.contourArea(c) < 1500: # 對于矩形區域,只顯示大于給定閾值的輪廓,所以一些微小的變化不會顯示。對于光照不變和噪聲低的攝像頭可不設定輪廓最小尺寸的閾值
continue
(x, y, w, h) = cv2.boundingRect(c) # 該函數計算矩形的邊界框
cv2.rectangle(frame_lwpCV, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.imshow('contours', frame_lwpCV)
cv2.imshow('dis', diff)
key = cv2.waitKey(1) & 0xFF
# 按'q'健退出循環
if key == ord('q'):
break
# When everything done, release the capture
camera.release()
cv2.destroyAllWindows()
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
