OpenCV系列(八)移動物體檢測
移動偵測,一般也叫運動檢測,常用于無人值守監(jiān)控錄像和自動報警。通過攝像頭按照不同幀率采集得到的圖像會被CPU按照一定算法進行計算和比較,當畫面有變化時,如有人走過,鏡頭被移動,計算比較結果得出的數(shù)字會超過閾值并指示系統(tǒng)能自動作出相應的處理。

OpenCV 實現(xiàn)
SPRING
那么在Opencv中,是怎么樣進行移動物體檢測的呢?其實Opencv中幫我們封裝好了背景減法的算法,我們只需要取得視頻當前幀及的前一幀,然后使用這個算法得到這兩幀的差異,再對其進行處理即可,具體代碼如下:
import cv2cam= cv2.VideoCapture('opencv_image/vtest.avi')# 先讀取視頻的前2幀_,img1=cam.read()_,img2=cam.read()while cam.isOpened():# 獲得兩幀之間的差異diff=cv2.absdiff(img1,img2)cv2.imshow('diff',diff)# 圖像處理:灰度,高斯模糊,二值化gray=cv2.cvtColor(diff,cv2.COLOR_BGR2GRAY)blur=cv2.GaussianBlur(gray,(5,5),0)_,th=cv2.threshold(blur,20,255,cv2.THRESH_BINARY)# 圖像膨脹操作dilated=cv2.dilate(th,None,iterations=3)cv2.imshow('dilated',dilated)# 獲取輪廓contours,_=cv2.findContours(dilated,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)# 判斷矩形是否滿足條件for contour in contours:(x,y,w,h)=cv2.boundingRect(contour)if cv2.contourArea(contour) <700:continueelse:cv2.rectangle(img1,(x,y),(x+w,y+h),(0,255,0),1)cv2.imshow('image',img1)# 讀下一幀img1=img2_,img2=cam.read()flag=cv2.waitKey(100)if flag==ord('q'):break# 別忘記釋放攝像頭cam.release()cv2.destroyAllWindows()
程序運行的結果如下,在視頻中運動的人以及飄動的隔離帶都被方框標注了出來:

函數(shù)解釋
SPRING
這個檢測綜合了比較多的OpenCV函數(shù),一一為大家解釋這些函數(shù)的參數(shù)以及作用:
dilated=cv2.dilate(src,kernel,iteration)
作用:形態(tài)學操作-膨脹
| src | 輸入的圖片 |
| kernel | 表示方框的大小 |
| interation | 迭代的次數(shù) |
膨脹操作的原理,存在一個kernel,在圖像上進行從左到右,從上到下的平移,如果方框中存在白色,那么這個方框內(nèi)所有的顏色都是白色。也就是說,它可以將二值化圖片中細小的白色‘變胖’。

contours,hierarchy=cv2.findContours(img,mode,method)
作用:查找檢測物體的輪廓
| image | 帶有輪廓信息的圖片 |
| model | 提取出輪廓后,輸出輪廓信息的組織形式,通常由以下幾種選項:
|
| method | 輪廓的近似辦法,有以下選項:
|
| contours | list結構,列表中每個元素代表一個邊沿信息。每個元素是(x,1,2)的三維向量,x表示該條邊沿里共有多少個像素點,第三維的那個“2”表示每個點的橫、縱坐標 |
| hierarchy | 返回類型是(x,4)的二維ndarray。x和contours里的x是一樣的意思。如果輸入選擇cv2.RETR_TREE,則以樹形結構組織輸出,hierarchy的四列分別對應下一個輪廓編號、上一個輪廓編號、父輪廓編號、子輪廓編號,該值為負數(shù)表示沒有對應項 |
注:如果輸入選擇cv2.CHAIN_APPROX_SIMPLE,則contours中一個list元素所包含的x點之間應該用直線連接起來,這個可以用cv2.drawContours()函數(shù)觀察一下效果。

函數(shù)解析:cv2.boundingRect(cnt)
作用:一般于輪廓檢測以前使用,可以使用一個最小的矩形,把找到的形狀包起來。cnt 即輪廓檢測中的每一個contour。
