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-但是那样的事情不是更。。。更慢的?因为我目前使用的方法速度很慢,可以跳过帧,所以如果某个东西过快,它将无法被检测到