我已经写下了一个代码,可以检测稳定背景上的移动物体并返回一个扩张的二进制点,可以用来实时跟踪x,y坐标,使用“cv2.findContours”方法。我的问题是,当我运行此代码时,它显示两个点一个是稳定点,显示对象的确切初始位置,而一个点连续移动并实时显示当前位置。现在我只是想显示实时位置而不是稳定点
import scipy.misc
import cv2
import time
cam = cv2.VideoCapture("VID_20150401_191129.3gp")
r, f1 = cam.read()
f1 = scipy.misc.imresize(f1, 0.4)
while(1):
r2, f2 = cam.read()
f2 = scipy.misc.imresize(f2, 0.4)
frameDelta = cv2.absdiff(f2,f1)
thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=4)
cv2.imshow('im',thresh)
k = cv2.waitKey(30) & 0xff
if k == 27:
break
答案 0 :(得分:0)
在这段代码中,您要做的是将初始帧(此处读取图像r, f1 = cam.read()
f1为帧)设置为背景帧,将读取帧设置为当前帧。您正在用剩余的帧减去第一帧。要获取运动对象,可以使用另一个名为backgroundUpdate的函数。
像这样
def backgroundUpdate():
backgroundFrame = np.uint8((0.1* currentFrame) + ((0.9) * previousFrame))
此处当前帧是读取帧,上一帧是上次读取的。
所以这里你的代码可以像这样改变
cam = cv2.VideoCapture("VID_20150401_191129.3gp")
while(1):
r, currentFrame = cam.read()
currentFrame = scipy.misc.imresize(f2, 0.4)
previousFrame = currentFrame
if backgroundFrame is None:
previousFrame = currentFrame
backgroundUpdate()
else:
backgroundUpdate()
previousFrame = currentFrame
frameDelta = cv2.absdiff(backgroundFrame, currentFrame)
thresh = cv2.threshold(frameDelta, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.dilate(thresh, None, iterations=4)
cv2.imshow('im',thresh)
k = cv2.waitKey(30) & 0xff
if k == 27:
break`
backgroundUpdate
函数通过捕获更新backgroundFrame
。这将产生良好的结果,而小的动作也会忽略。确保两个函数都可以访问变量。为此,您可以使用global
。
对于捕获后的更佳解决方案,您可以使用灰色转换和模糊。这是代码。
In [1]: currentFrame = cv2.cvtColor(Frame, cv2.COLOR_BGR2GRAY)
In [2]: currentFrame = cv2.GaussianBlur(currentFrame, (25, 25), 0)