天天看點

【執行個體】python和opencv建構運動檢測器

照着一個示例跑,目标本是捕獲進入攝像頭的第一幀然後會一直追蹤這一個物體,如果出現的話會框出來,但是不知道什麼原因,第一個框出來之後移動到别的地方還是會框别的東西,然後攝像頭打開幾秒就自動停止了還報錯

【執行個體】python和opencv建構運動檢測器
【執行個體】python和opencv建構運動檢測器
import pandas

firstframe = None
status = [None,None]
df = pandas.DataFrame(columns=["start","end"])
cap = cv2.VideoCapture(1)
while True:
    check,colorframe = cap.read()
    status = 0
    gray = cv2.cvtColor(colorframe,cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray,(21,21),0) #高斯模糊去除噪聲
    if firstframe is None:
        firstframe = gray
        continue #捕獲第一個灰階幀 得到第一幀後不進行後續處理
    delta_frame = cv2.absdiff(firstframe,gray)
    # ,我們需要找出第一幀和目前幀之間的差別。是以,我們使用absdiff函數并将得到的結果稱為delta幀。對于我們的用例來說,僅僅找到一個差異是不夠的,是以我們需要定義一個像素門檻值,它可以被視為真實的對象。我們可以選擇30像素作為标準門檻值,并将标準門檻值的顔色定義為白色(顔色代碼:255). 二進制門檻值函數THRESH_BINARY傳回一個元組值,其中隻有第二項([0]是第一項,[1]是第二項)包含生成的門檻值幀。二進制門檻值函數用于處理含有2個離散值的非連續函數:如0或1。如果攝影機前面沒有對象,我們将目前幀的狀态視為0;如果攝影機前面存在對象,則将目前幀的狀态視為1。 

    thresh_frame = cv2.threshold(delta_frame,30,255,cv2.THRESH_BINARY)[1]
    thresh_frame = cv2.dilate(thresh_frame,None,iterations=3)
    # 在膨脹函數Dilate中,我們可以通過設定疊代次數來設定平滑度。疊代次數越多,平滑度越高,處理時間也就越長。是以,建議保持标準化設定為3。膨脹函數中的“None”參數表示我們的應用中不需要元素結構。 

#聲明元組的文法 (cnts,_)
    (cnts,_) = cv2.findContours(thresh_frame.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
    for contours in cnts :
        if cv2.contourArea(contours) < 10000:
            continue
        if cv2.contourArea(contours) < 20000:
         status = 1
         (x,y,w,h) = cv2.boundingRect(contours)
         cv2.rectangle(colorframe,(x,y),(x+w,y+h),(0,0,255),3)
         cv2.imshow("cc",colorframe)
    key = cv2.waitKey(1)
    if key == ord('q'):
       break
           

顯然這裡有什麼問題。

留待解決:高斯平滑參數的擷取