之前我在超市看到當(dāng)有物體經(jīng)過時(shí),監(jiān)控的屏幕邊緣會出現(xiàn)綠框。感覺蠻有意思的。來用opencv試試能不能實(shí)現(xiàn)類似的效果。
我采用的檢測動態(tài)物體的方法是,比較前后兩幀圖像,即當(dāng)前畫面與上一幀的畫面出現(xiàn)了不同。我們把兩幀畫面進(jìn)行比較。然后框選出運(yùn)動的物體。我們還希望程序可以判斷當(dāng)前窗口到底有沒有物體在運(yùn)動。那么我們就需要添加一個(gè)狀態(tài)。為了方便我們找到什么時(shí)間有物體移動,我打印出時(shí)間。
當(dāng)我們的程序檢測到移動的物體時(shí),會捕捉到它的輪廓,添加一個(gè)外接整矩形框,返回x,y的坐標(biāo)。當(dāng)不返回坐標(biāo)時(shí),則意味著沒有物體運(yùn)動,我們通過坐標(biāo)值來是否有物體移動。并打印出當(dāng)時(shí)的本地時(shí)間。
import cv2
import time
import numpy as np
def videos():
cap = cv2.VideoCapture(1)
#不設(shè)置是默認(rèn)640*480,我們這里設(shè)置出來
cap.set(3, 640)
cap.set(4, 480)
img_num = 0
k = np.ones((3, 3), np.uint8)
while True:
success, img = cap.read()
localtime = time.asctime(time.localtime(time.time()))
if not img_num:
# 這里是由于第一幀圖片沒有前一幀
previous = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray_diff = cv2.absdiff(gray, previous) # 計(jì)算絕對值差
# previous 是上一幀圖片的灰度圖
thresh = cv2.threshold(gray_diff, 40, 255, cv2.THRESH_BINARY)[1]
mask = cv2.medianBlur(thresh, 3)
close = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, k)
cnts = cv2.findContours(close,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)[0]
for c in cnts:
area = cv2.contourArea(c)
if area > 50:
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
if x>0:
print("動",localtime)
cv2.putText(img, localtime, (30, 30), cv2.FONT_HERSHEY_COMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow("x", close)
cv2.imshow("Result", img)
img_num += 1
if cv2.waitKey(1) 0xFF == ord('q'):
break
videos()
這個(gè)方法的弊端是當(dāng)環(huán)境光線亮度變化過大時(shí),返回的輪廓會產(chǎn)生變化,導(dǎo)致程序判斷整個(gè)屏幕都在運(yùn)動,這點(diǎn)仍需改進(jìn)。
到此這篇關(guān)于opencv檢測動態(tài)物體的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)opencv檢測動態(tài)物體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!