13

誰かが私を助けることができれば、どうもありがとう。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 を試してください)しかし、動作しません。

どうもありがとう。

4

4 に答える 4

13

コードを少し変更する必要があります。

まず、 、mgridint32などのメソッドvstackは numpy 関数であるため、Numpy ライブラリをインクルードします。

したがって、コードの先頭に次を追加します。

from numpy import *

2番目に、あなたの質問に来て、4番目の引数はint. フロートとして提供しました。1 (またはお好みで 3) にします。そして最後の引数は出力そのものです。あなたはそれを必要としません。だからそれを削除します。

したがって、私の最終的なステートメントは次のようになります(そして、それは私にとってはうまく機能します):

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

これを試して、エラーが発生した場合はお知らせください。

于 2012-12-03T16:51:02.777 に答える
5

@サンサイド

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 のドキュメントを参照してください

于 2017-05-23T09:50:37.573 に答える
2

次のように関数を呼び出すと、次のエラー メッセージが表示されます。

 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

Nonefor parameterの値を渡すべきではないことがわかりましたpyr_scaleNoneただし、パラメーターに渡すことはできflowます。

  • pyr_scale: 各画像のピラミッドを構築するための画像スケール (<1) を指定するパラメーター。pyr_scale = 0.5次の各レイヤーが前のレイヤーの 2 倍小さい古典的なピラミッドを意味します。

  • flowprvs:とタイプが同じサイズの計算されたフロー イメージCV_32FC2

于 2016-08-01T19:05:36.920 に答える