opencv檢測動態物體的實現
之前我在超市看到當有物體經過時,監控的屏幕邊緣會出現綠框。感覺蠻有意思的。來用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()來控制時間變化,這會影響我們視頻的幀率
這個方法的弊端是當環境光線亮度變化過大時,返回的輪廓會產生變化,導致程序判斷整個屏幕都在運動,這點仍需改進。
到此這篇關於opencv檢測動態物體的實現的文章就介紹到這瞭,更多相關opencv檢測動態物體內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 使用OpenCV實現迷宮解密的全過程
- 使用python和opencv的mask實現摳圖疊加
- python中opencv圖像疊加、圖像融合、按位操作的具體實現
- python OpenCV圖像金字塔
- python和opencv構建運動檢測器的實現