非常感谢,如果有人能帮助我的话。我试着,在第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中,因为这需要float中的数字,因此,我尝试calcOpticalFlowFarneback(prev_gray,gray,None,float(0.5),3,15,3,5,float(1.2),0 )但不工作。
非常感谢。
您需要稍微更改一下代码。
首先,包括Numpy库,因为像mgrid
,int32
,vstack
这样的方法都是numpy函数。
所以在代码的顶部添加:
from numpy import *
第二,提出你的问题,第四个论点应该是int
。你已经提供它作为浮动。将它设为1(或3,如你所愿)。最后一个参数是输出本身。你不需要它。所以删除它。
所以我的最终陈述如下所示(它对我来说很好):
flow = cv2.calcOpticalFlowFarneback(prev_gray,gray,0.5,1,3,15,3,5,1)
试试这个,如果有任何错误,请告诉我。
@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,请参阅alose 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__
如果您使用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)
当我按如下方式调用该函数时,将显示以下错误消息:
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
:一个参数,指定图像比例(<1)为每个图像构建金字塔; pyr_scale = 0.5
意为经典金字塔,其中每个下一层比前一层小两倍。flow
:计算出的流量图像,其大小与prvs
相同,类型为CV_32FC2
。