??哈嘍,大家好呀,這里是滑稽研究所,之前我在超市看到當有物體經過時,監控的螢屏邊緣會出現綠框,感覺蠻有意思的,來用opencv試試能不能實作類似的效果,
??我采用的檢測動態物體的方法是,比較前后兩幀影像,即當前畫面與上一幀的畫面出現了不同,我們把兩幀畫面進行比較,然后框選出運動的物體,我們還希望程式可以判斷當前視窗到底有沒有物體在運動,那么我們就需要添加一個狀態,為了方便我們找到什么時間有物體移動,我列印出時間,
??當我們的程式檢測到移動的物體時,會捕捉到它的輪廓,添加一個外接整矩形框,回傳x,y的坐標,當不回傳坐標時,則意味著沒有物體運動,我們通過坐標值來是否有物體移動,并列印出當時的本地時間,
??源代碼:
import cv2
import time
import numpy as np
def videos():
cap = cv2.VideoCapture(1)
#不設定是默認640*480,我們這里設定出來
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) # 計算絕對值差
# 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()
??靜:

??動:
??當有物體經過視窗時,控制臺列印出了時間,這樣便于我們在錄制好的視頻內查找,


??為了方便,我在視窗左上角加入了時間和日期,
**注意!**必須把
localtime = time.asctime(time.localtime(time.time()))
放入主回圈內,否則只回傳呼叫的一瞬間的本地時間,不會程式持續,
也不可以使用time.sleep()來控制時間變化,這會影響我們視頻的幀率
??這個方法的弊端是當環境光線亮度變化過大時,回傳的輪廓會產生變化,導致程式判斷整個螢屏都在運動,這點仍需改進,有好的想法,大家請在評論區提出,或者私信告訴我,感謝大家,
??轉載自:滑稽研究所
??閱讀更多相關文章,請關注我們吧!

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289168.html
標籤:AI
上一篇:編程之路,須鑄金蟬之勢
下一篇:加殼學習系列(二)-殼代碼
