但它显示了一个稳定的初始足迹随着移动的物体

2022-07-06 12:44:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了一个代码,可以在一个稳定的背景下检测到一个移动的物体,并返回一个扩展的二进制点,可以用来跟踪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

Tags: 代码importread二进制scipycv2物体f2f1misc背景camthreshimresizeframedelta
1条回答
网友
1楼 ·

在这段代码中,您要做的是将初始帧(这里的读取图像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)