Python (已编辑)背景2+;均值漂移跟踪?

Python (已编辑)背景2+;均值漂移跟踪?,python,opencv,numpy,video-capture,raspberry-pi2,Python,Opencv,Numpy,Video Capture,Raspberry Pi2,我正在做一个基于运动的检测项目。 但是,它会将背景中的变化检测为“运动”,因此我希望每隔几分钟重新捕获一个新的第一帧,以替换当前帧来解决此问题。 我使用的是覆盆子Pi 2B和罗技网络摄像头。 我使用的代码基于: 这是我的代码版本。 请帮帮我 (编辑)我已将我的代码更改为Background2,现在我的问题是如何添加均值漂移跟踪,以便它能够识别先前在帧中进入屏幕的同一对象 import sys sys.path.append('/usr/local/lib/python3.4/site-p

我正在做一个基于运动的检测项目。

但是,它会将背景中的变化检测为“运动”,因此我希望每隔几分钟重新捕获一个新的第一帧,以替换当前帧来解决此问题。

我使用的是覆盆子Pi 2B和罗技网络摄像头。
我使用的代码基于:

这是我的代码版本。
请帮帮我

(编辑)我已将我的代码更改为Background2,现在我的问题是如何添加均值漂移跟踪,以便它能够识别先前在帧中进入屏幕的同一对象

import sys
sys.path.append('/usr/local/lib/python3.4/site-packages')
import numpy as np
import cv2
import imutils
from imutils import contours
import datetime
import time

#cap = cv2.VideoCapture("/home/pi/Desktop/Proj/VideoTestSample.mp4")
cap = cv2.VideoCapture(0)

fgbg = cv2.createBackgroundSubtractorMOG2()

while (cap.isOpened()):
    (grabbed, frame) = cap.read()
    text = " "

    if not grabbed:
        break

    frame = imutils.resize(frame, width=500)
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    gray = cv2.medianBlur(gray, 5)

    fgmask = fgbg.apply(gray)
    thresh = cv2.erode(fgmask, None, iterations=2)
    (_,cnts,hierarchy) = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for (i,c) in enumerate(cnts):
        if cv2.contourArea(c) < 300:
            continue

        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x,y), (x+w,y+h), (0,255,0), 2)
        cv2.putText(frame, "#{}".format(i + 1), (x, y - 15),
            cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 0, 255), 2)        
        text = "REC"

    cv2.putText(frame, "{}". format(text), (10,20),
                cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)

    cv2.putText(frame, datetime.datetime.now().strftime("%A %d %B %Y %I:%M:%S%p"),
                (10, frame.shape[0] - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.35,(0,0,255), 1)

    cv2.imshow('frame',frame)
    cv2.imshow('gray', gray)
    cv2.imshow('fgmask', fgmask)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()
导入系统 sys.path.append(“/usr/local/lib/python3.4/site packages”) 将numpy作为np导入 进口cv2 导入imutils 从imutils导入等高线 导入日期时间 导入时间 #cap=cv2.VideoCapture(“/home/pi/Desktop/Proj/VideoTestSample.mp4”) cap=cv2.视频捕获(0) fgbg=cv2.createBackgroundSubtractorMOG2() while(cap.isOpened()): (抓取,帧)=盖读取() text=“” 如果没有抓到: 打破 frame=imutils.resize(frame,width=500) 灰色=cv2.CVT颜色(边框,cv2.COLOR\u BGR2GRAY) 灰色=cv2.medianBlur(灰色,5) fgmask=fgbg.apply(灰色) thresh=cv2.腐蚀(fgmask,无,迭代次数=2) (u,cnts,hierarchy)=cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_近似_SIMPLE) 对于枚举(CNT)中的(i,c): 如果cv2.轮廓面积(c)<300: 持续 (x,y,w,h)=cv2.boundingRect(c) cv2.矩形(框架,(x,y),(x+w,y+h),(0255,0),2) cv2.putText(框架,“{}”。格式(i+1),(x,y-15), cv2.FONT_HERSHEY_SIMPLEX,0.45,(0,0,255),2) text=“REC” cv2.putText(框架“{}”。格式(文本),(10,20), cv2.FONT_HERSHEY_SIMPLEX,0.5,(0,0,255),2) cv2.putText(frame,datetime.datetime.now().strftime(“%A%d%B%Y%I:%M:%S%p”), (10,帧形状[0]-10),cv2.FONT_HERSHEY_SIMPLEX,0.35,(0,0255),1) cv2.imshow(“帧”,帧) cv2.imshow(“灰色”,灰色) cv2.imshow('fgmask',fgmask) 如果cv2.waitKey(1)&0xFF==ord('q'): 打破 第1章释放() cv2.destroyAllWindows()
如果你想检测运动,为什么不使用像
cv2.backgroundsubtractorkn
cv2这样的背景减法器呢。背景SubtractorMOG2
?@QuangHoang-这和我上面使用的方法不一样吗?有何不同?(很抱歉,我是一个初学者,只有6周的OpenCV经验)它将在几个帧上构建背景,而不仅仅是比较两个帧。因此背景模型更稳定,即对环境变化不太敏感background@QuangHoang-但是那样的事情不是更。。。更慢的?因为我目前使用的方法速度很慢,可以跳过帧,所以如果某个东西过快,它将无法被检测到