opencv檢測(cè)動(dòng)態(tài)物體的實(shí)現(xiàn)
之前我在超市看到當(dāng)有物體經(jīng)過(guò)時(shí),監(jiān)控的屏幕邊緣會(huì)出現(xiàn)綠框。感覺(jué)蠻有意思的。來(lái)用opencv試試能不能實(shí)現(xiàn)類似的效果。
我采用的檢測(cè)動(dòng)態(tài)物體的方法是,比較前后兩幀圖像,即當(dāng)前畫面與上一幀的畫面出現(xiàn)了不同。我們把兩幀畫面進(jìn)行比較。然后框選出運(yùn)動(dòng)的物體。我們還希望程序可以判斷當(dāng)前窗口到底有沒(méi)有物體在運(yùn)動(dòng)。那么我們就需要添加一個(gè)狀態(tài)。為了方便我們找到什么時(shí)間有物體移動(dòng),我打印出時(shí)間。
當(dāng)我們的程序檢測(cè)到移動(dòng)的物體時(shí),會(huì)捕捉到它的輪廓,添加一個(gè)外接整矩形框,返回x,y的坐標(biāo)。當(dāng)不返回坐標(biāo)時(shí),則意味著沒(méi)有物體運(yùn)動(dòng),我們通過(guò)坐標(biāo)值來(lái)是否有物體移動(dòng)。并打印出當(dāng)時(shí)的本地時(shí)間。
源代碼:
import cv2 import time import numpy as np def videos(): cap = cv2.VideoCapture(1) #不設(shè)置是默認(rèn)640*480,我們這里設(shè)置出來(lái) 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: # 這里是由于第一幀圖片沒(méi)有前一幀 previous = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray_diff = cv2.absdiff(gray, previous) # 計(jì)算絕對(duì)值差 # 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("動(dòng)",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()
靜:
動(dòng):
當(dāng)有物體經(jīng)過(guò)窗口時(shí),控制臺(tái)打印出了時(shí)間。這樣便于我們?cè)阡浿坪玫囊曨l內(nèi)查找。
為了方便,我在窗口左上角加入了時(shí)間和日期。
**注意!**必須把
localtime = time.asctime(time.localtime(time.time()))
放入主循環(huán)內(nèi),否則只返回調(diào)用的一瞬間的本地時(shí)間,不會(huì)程序持續(xù)。
也不可以使用time.sleep()來(lái)控制時(shí)間變化,這會(huì)影響我們視頻的幀率
這個(gè)方法的弊端是當(dāng)環(huán)境光線亮度變化過(guò)大時(shí),返回的輪廓會(huì)產(chǎn)生變化,導(dǎo)致程序判斷整個(gè)屏幕都在運(yùn)動(dòng),這點(diǎn)仍需改進(jìn)。
到此這篇關(guān)于opencv檢測(cè)動(dòng)態(tài)物體的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)opencv檢測(cè)動(dòng)態(tài)物體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PyTorch數(shù)據(jù)讀取的實(shí)現(xiàn)示例
這篇文章主要介紹了PyTorch數(shù)據(jù)讀取的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03python連接數(shù)據(jù)庫(kù)后通過(guò)占位符添加數(shù)據(jù)
在pymysql中支持對(duì)占位符的處理,開發(fā)者需要在SQL中使用“%”定義占位符,在使用excute()方法執(zhí)行時(shí)對(duì)占位符的數(shù)據(jù)進(jìn)行填充即可,本文給大家介紹python連接數(shù)據(jù)庫(kù)后通過(guò)占位符添加數(shù)據(jù)的方法,需要的朋友參考下吧2021-12-12python通過(guò)socket實(shí)現(xiàn)多個(gè)連接并實(shí)現(xiàn)ssh功能詳解
這篇文章主要介紹了python通過(guò)socket實(shí)現(xiàn)多個(gè)連接并實(shí)現(xiàn)ssh功能詳解,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11python 實(shí)現(xiàn)按對(duì)象傳值
今天小編就為大家分享一篇python 實(shí)現(xiàn)按對(duì)象傳值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python?JMESPath庫(kù)輕松操作JSON進(jìn)行數(shù)據(jù)查詢方法實(shí)例
這篇文章主要為大家介紹了Python?JMESPath庫(kù)輕松操作JSON方法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Django Admin實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼(省市區(qū))
多級(jí)菜單在很多上面都有應(yīng)用,這篇文章主要介紹了Django Admin實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)(省市區(qū)),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06python將xml xsl文件生成html文件存儲(chǔ)示例講解
這篇文章主要介紹了python將xml、xsl文件轉(zhuǎn)成html文件存儲(chǔ)方法,大家參考使用吧2013-12-12