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

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
顯然這裡有什麼問題。
留待解決:高斯平滑參數的擷取