Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对象左侧,但它显示了一个稳定的初始足迹以及移动的对象跟踪器_Python_Opencv_Simplecv - Fatal编程技术网

Python 对象左侧,但它显示了一个稳定的初始足迹以及移动的对象跟踪器

Python 对象左侧,但它显示了一个稳定的初始足迹以及移动的对象跟踪器,python,opencv,simplecv,Python,Opencv,Simplecv,我写下了一个代码,可以在稳定的背景下检测到移动的物体,并返回一个扩展的二进制点,该点可以用于使用“cv2.findContours”方法实时跟踪x,y坐标的位置。我的问题是,当我运行这段代码时,它显示了两个点,一个是稳定点,它显示了对象的精确初始位置,而一个点连续移动并实时显示当前位置。现在我只想显示实时位置,而不是稳定点 import scipy.misc import cv2 import time cam = cv2.VideoCapture("VID_20150401_191129.3

我写下了一个代码,可以在稳定的背景下检测到移动的物体,并返回一个扩展的二进制点,该点可以用于使用“cv2.findContours”方法实时跟踪x,y坐标的位置。我的问题是,当我运行这段代码时,它显示了两个点,一个是稳定点,它显示了对象的精确初始位置,而一个点连续移动并实时显示当前位置。现在我只想显示实时位置,而不是稳定点

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

在本代码中,您要做的是将初始帧(此处读取图像
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

为了在拍摄后获得更好的解决方案,你可以使用灰度转换和模糊

[1]中的
:currentFrame=cv2.CVT颜色(Frame,cv2.COLOR\u BGR2GRAY)

在[2]:currentFrame=cv2.GaussianBlur(currentFrame,(25,25),0)

谢谢您的评论。它显示“NameError:name'backgroundFrame'未定义”我应该做什么..在while循环之前的函数开始时,只需声明
backgroundFrame=None
。然后它将被解决。嘿,谢谢,我已经这么做了,但现在它显示的错误如下:OpenCV错误:输入参数的大小不匹配(操作既不是array op array(其中数组具有相同的大小和通道数),也不是Arrithm_op中的“array op scalar”,也不是“scalar op array”),文件/build/buildd/opencv-2.3.1/modules/core/src/arithm.cpp,第1253行回溯(最后一次调用):文件“stack.py”,第26行,frameDelta=cv2.absdiff(backgroundFrame,currentFrame)中的resize行你能评论一下代码中的resize行吗(
currentFrame=scipy.misc.imresize(f2,0.4)
)。然后发布结果。是的,我已经注释掉了相应的行,但错误仍然存在