基于OpenCV實(shí)戰(zhàn):動(dòng)態(tài)物體檢測(cè)
最近,閉路電視安全系統(tǒng)運(yùn)行著多種算法來(lái)確保安全,例如面部識(shí)別,物體檢測(cè),盜竊檢測(cè),火災(zāi)警報(bào)等。我們?cè)谶\(yùn)動(dòng)檢測(cè)的基礎(chǔ)上實(shí)現(xiàn)了許多算法,因?yàn)樵诳臻e幀上運(yùn)行所有這些進(jìn)程沒(méi)有任何意義。在本文中,我們將討論實(shí)現(xiàn)基于運(yùn)動(dòng)檢測(cè)的視頻保存。
OpenCV:pip install opencv-python# Converting the image to GrayScalegray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)gray = cv2.GaussianBlur(gray,(21,21),0)# Saving the First Frameif first_frame is None:first_frame = graycontinue
然后,我們將后續(xù)幀與保存的第一幀進(jìn)行比較,以觀察差異。計(jì)算完差異后,我們可以應(yīng)用閾值將其轉(zhuǎn)換為黑白圖像。
#Calculates difference to detect motiondelta_frame = cv2.absdiff(first_frame, gray)#Applies Threshold and converts it to black & white imagethresh_delta = cv2.threshold(delta_frame, 30, 255, cv2.THRESH_BINARY)[1]thresh_delta = cv2.dilate(thresh_delta, None, iterations=0)#finding contours on the white portion(made by the threshold)cnts,_ = cv2.findContours(thresh_delta.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
最后一個(gè)命令在該黑白圖像中查找輪廓,并給出用于創(chuàng)建邊界框的坐標(biāo),如上面的視頻所示。使用運(yùn)動(dòng)檢測(cè)的好處:
它不會(huì)保存無(wú)用的空閑鏡頭。因此,減少了其他算法的工作量,因?yàn)椴粫?huì)保存空閑幀進(jìn)行處理。
它需要較少的計(jì)算,并且適合實(shí)時(shí)實(shí)施。
給定的因素導(dǎo)致輪廓檢測(cè)不理想,運(yùn)動(dòng)檢測(cè)的幼稚方法會(huì)在執(zhí)行開始時(shí)為所有比較保存第一幀。不好有幾個(gè)原因:
白天的照明條件可能會(huì)改變。
天氣變化。
執(zhí)行時(shí)相機(jī)被遮擋。
解決方案:在沒(méi)有運(yùn)動(dòng)的情況下,可以通過(guò)定期定期更新保存的幀來(lái)輕松解決此問(wèn)題。
# Number of idle frames to pass before changing the saved frame# for further comparisionsFRAMES_TO_PERSIST = 1000
然后將其放在while循環(huán)中:
#increment delay counter for every idle framedelay_counter += 1#Update the saved first frameif delay_counter > FRAMES_TO_PERSIST:delay_counter = 0first_frame = next_frame
當(dāng)檢測(cè)到運(yùn)動(dòng)時(shí),將delay_counter設(shè)置為零,微小的物體(例如蜜蜂和昆蟲)和通常不必要的輕微不必要的運(yùn)動(dòng)被存儲(chǔ)起來(lái)。解決方案:如片段所示,我們應(yīng)該在該區(qū)域設(shè)置一個(gè)閾值。
# Minimum boxed area(in pixels) for a detected motion to count as actual motion# Use to filter out noise or small objectsMIN_SIZE_FOR_MOVEMENT = 2000
然后在while循環(huán)中放置一個(gè)if語(yǔ)句:
#Checks if the area is big enough to be considered as motion.if cv2.contourArea(c) > MIN_SIZE_FOR_MOVEMENT:#Your code
所有這些都是針對(duì)同一視頻(30-fps,1280x720)計(jì)算的。
Raspberry Pi 2:
規(guī)格 1.5 GHz處理器 1 GB內(nèi)存 沒(méi)有GPU FPS:每秒8.08幀
Jetson Nano:
規(guī)格 四核ARM處理器1.43Ghz 2 Gb內(nèi)存 GPU:128核心Nvidia Maxwell FPS:每秒33幀
個(gè)人電腦 :
規(guī)格 i7第八代處理器 16 GB內(nèi)存 GTX 1060 6 GB GPU FPS:每秒37幀
潛在應(yīng)用:
智能鈴:
如果有人站在您家門口,它將自動(dòng)觸發(fā)鈴聲,并向您發(fā)送提示。
潛在威脅警報(bào):
如果有人站在您家門前的時(shí)間長(zhǎng)于正常時(shí)間,它將提醒您。
在本文中,我們實(shí)現(xiàn)了一個(gè)非?;镜匾乃惴ǎ捎糜谟行н\(yùn)行所有其他算法。可以對(duì)該運(yùn)動(dòng)檢測(cè)算法進(jìn)行更多修改,以使其更加健壯。
?------------------------------------------------
雙一流高校研究生團(tuán)隊(duì)創(chuàng)建 ↓
專注于計(jì)算機(jī)視覺(jué)原創(chuàng)并分享相關(guān)知識(shí) ?
聞道有先后,術(shù)業(yè)有專攻,如是而已 ╮(╯_╰)╭
