【问题标题】:OpenCV Python calcOpticalFlowFarnebackOpenCV Python calcOpticalFlowFarneback
【发布时间】:2018-02-11 08:13:05
【问题描述】:

非常感谢,如果有人可以帮助我。我尝试使用第 216 页末尾的“OReilly Programming Computer Vision with Python”一书的示例。

    #!/usr/bin/env python

import cv2
def draw_flow(im,flow,step=16):
    h,w = im.shape[:2]
    y,x = mgrid[step/2:h:step,step/2:w:step].reshape(2,-1)
    fx,fy = flow[y,x].T

    # create line endpoints
    lines = vstack([x,y,x+fx,y+fy]).T.reshape(-1,2,2)
    lines = int32(lines)

    # create image and draw
    vis = cv2.cvtColor(im,cv2.COLOR_GRAY2BGR)
    for (x1,y1),(x2,y2) in lines:
        cv2.line(vis,(x1,y1),(x2,y2),(0,255,0),1)
        cv2.circle(vis,(x1,y1),1,(0,255,0), -1)
    return vis


cap = cv2.VideoCapture(0)

ret,im = cap.read()
prev_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

while True:
    # get grayscale image
    ret,im = cap.read()
    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

    # compute flow
    #flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0)
    flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,float(0),float(0),3,15,3,5,float(1),0)
    prev_gray = gray

    # plot the flow vectors
    cv2.imshow('Optical flow',draw_flow(gray,flow))
    if cv2.waitKey(10) == 27:
        break

我在终端(LXUbuntu,lxterminal)中执行,我收到以下错误:

VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
VIDIOC_QUERYMENU: Invalid argument
Traceback (most recent call last):
  File "hw.py", line 35, in <module>
    flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,None,0.5,3,15,3,5,1.2,0)
TypeError: a float is required

我知道问题出在函数 calcOpticalFlowFarneback 中,因为这需要浮点数,因此,我尝试 calcOpticalFlowFarneback(prev_gray,gray,None,float(0.5),3,15,3,5,float(1.2 ),0) 但不起作用。

非常感谢。

【问题讨论】:

  • "a float is required" 可能是指参数列表中的非浮点、非整数参数..

标签: python opencv


【解决方案1】:

你需要稍微修改一下代码。

首先,包含 Numpy 库,因为 mgridint32vstack 等方法都是 numpy 函数。

所以在代码的顶部,添加:

from numpy import *

第二,关于你的问题,第四个参数应该是int。您已将其作为浮点数提供。将其设为 1(或 3,如您所愿)。最后一个参数是输出本身。你不需要它。所以删除它。

所以我的最终陈述如下所示(对我来说效果很好):

flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,0.5,1,3,15,3,5,1)

试试这个,如果出现任何错误,请告诉我。

【讨论】:

    【解决方案2】:

    @sunside

    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
    
    cv2.calcOpticalFlowFarneback(prev, next, flow, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags) → flow
    

    是opencv3.x grama,另见opencv3.x doc

    否则:

    flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
    TypeError: a float is required
    
    cv2.calcOpticalFlowFarneback(prev, next, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags[, flow])
    

    你一定是在opencv2.x上运行过,可以这样断言:

    import cv2
    print cv2.__version__
    

    opencv2.x doc

    【讨论】:

      【解决方案3】:

      如果你使用Python3,插入def draw_flow

      y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1).astype(int) 
      flow = cv2.calcOpticalFlowFarneback(prevgray, gray, None, 0.5, 3, 15, 3, 5, 1.2, 0)
      

      对于 Python 2,您应该使用

      y, x = np.mgrid[step/2:h:step, step/2:w:step].reshape(2,-1)
      flow = cv2.calcOpticalFlowFarneback(prevgray, gray, 0.5, 3, 15, 3, 5, 1.2, 0)
      

      【讨论】:

        【解决方案4】:

        当我如下调用该函数时,显示以下错误消息:

         flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)
        

        错误:

        flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0) 
        TypeError: a float is required
        

        当我删除值 None 时,我的程序可以正常工作:

        flow = cv2.calcOpticalFlowFarneback(prvs, next, 0.5, 3, 15, 3, 5, 1.2, 0)
        

        函数calcOpticalFlowFarneback()成形:

        cv2.calcOpticalFlowFarneback(prev, next, pyr_scale, levels, winsize, iterations, poly_n, poly_sigma, flags[, flow]) → flow
        

        事实证明,我们不应该将None 的值传递给参数pyr_scale。我们可以将None 传递给参数flow

        • pyr_scale:参数,指定图像比例(pyr_scale = 0.5 表示经典金字塔,其中下一层比上一层小两倍。

        • flow:计算出的流图,大小与prvs相同,类型为CV_32FC2

        【讨论】:

        • 正如他们所指出的,这是不相关的评论,但这就是发生这种情况的原因:因为该函数在 python 2 和 python 3 中接受不同的参数。因此,请确保您正在阅读与您的环境相匹配的手册.您可以使用 cv2.cv.__version__ 进行检查
        猜你喜欢
        • 2018-05-23
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 2021-03-02
        • 2011-08-16
        相关资源
        最近更新 更多