我正在编写一个小脚本(使用Python),该脚本可以生成和更新相机供稿的运行平均值。当我调用cv.RunningAvg时,它返回:

cv2.error: func != 0

我在实现cv.RunningAvg的过程中遇到了什么困难?脚本如下:
import cv

feed = cv.CaptureFromCAM(0)
frame = cv.QueryFrame(feed)
moving_average = cv.QueryFrame(feed)
cv.NamedWindow('live', cv.CV_WINDOW_AUTOSIZE)

def loop():
    frame = cv.QueryFrame(feed)
    cv.ShowImage('live', frame)
    c = cv.WaitKey(10)

    cv.RunningAvg(frame, moving_average, 0.020, None)

while True:
    loop()

最佳答案

我不确定该错误,但请查看的文档cv.RunningAvg
它说目标应该是32或64位浮点。
因此,我对您的代码做了一些小的更正,并且可以正常工作。我创建了一个 32位浮点图像来存储运行平均值然后存储另一个8位图像,以便显示运行平均值图像:

import cv2.cv as cv

feed = cv.CaptureFromCAM(0)
frame = cv.QueryFrame(feed)
moving_average = cv.CreateImage(cv.GetSize(frame),32,3) # image to store running avg
avg_show = cv.CreateImage(cv.GetSize(frame),8,3) # image to show running avg

def loop():
    frame = cv.QueryFrame(feed)
    c = cv.WaitKey(10)

    cv.RunningAvg(frame, moving_average, 0.1, None)
    cv.ConvertScaleAbs(moving_average,avg_show) # converting back to 8-bit to show

    cv.ShowImage('live', frame)
    cv.ShowImage('avg',avg_show)

while True:
    loop()

cv.DestroyAllWindows()
现在看到结果:
在特定时刻,我保存了一个帧及其对应的移动平均帧。
原始框架:
You can see the obstacle (my hand) blocks the objects in behind
现在运行平均帧:

它几乎移开了我的手,并在背景中显示了对象。
那就是it is a good tool for background subtraction
典型交通视频中的另一个示例:

您可以在此处查看更多详细信息和示例:http://opencvpython.blogspot.com/2012/07/background-extraction-using-running.html

10-08 05:03