OpenCV Python calcOpticalFlowFarneback

use*_*896 11 python opencv

非常感谢,如果有人能帮助我的话.我试着,在第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
Run Code Online (Sandbox Code Playgroud)

我在终端执行(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
Run Code Online (Sandbox Code Playgroud)

我知道问题出在函数calcOpticalFlowFarneback中,因为这需要float中的数字,因此,我尝试calcOpticalFlowFarneback(prev_gray,gray,None,float(0.5),3,15,3,5,float(1.2),0 )但不工作.

非常感谢.

Abi*_*n K 14

您需要稍微更改一下代码.

首先,包括numpy的图书馆,因为类似的方法mgrid,int32,vstack是numpy的功能.

所以在代码的顶部添加:

from numpy import *
Run Code Online (Sandbox Code Playgroud)

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

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

flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,0.5,1,3,15,3,5,1)
Run Code Online (Sandbox Code Playgroud)

试试这个,如果有任何错误,请告诉我.


Jia*_*ian 5

@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
Run Code Online (Sandbox Code Playgroud)

是 opencv3.x 语法,另见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])
Run Code Online (Sandbox Code Playgroud)

你必须在 opencv2.x 上运行,它可以这样断言:

import cv2
print cv2.__version__
Run Code Online (Sandbox Code Playgroud)

请参阅opencv2.x 文档