4

cv2.calcOpticalFlowPyrLK を使用して、Python でオプティカル フローの Lucas-Kanade アルゴリズムを実装しようとしています。ただし、現在のポイントと前のポイント、およびポイント自体を接続する線を描画しようとすると、関数は None を返します。

ここにコードがあります

#draw the overlaying tracking img
for i,(new,old) in enumerate(zip(good_new,good_old)):
    a,b = new.ravel() #tmp new value
    c,d = old.ravel() #tmp old value

    #draws a line connecting the old point with the new point
    mask = cv2.line(mask,(a,b),(c,d),color[i].tolist(),2) #returns None... why??
    #draws the new point
    frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1) #returns None... why??

img = cv2.add(frame,mask)

#show on window
cv2.imshow("frame",img)

a、b、c、d は numpy.float32 です

フレームは、ウェブカメラから読み取った値です

マスクはゼロの配列に初期化されています

色はランダムな配列です

これは、imshow を実行しようとしたときに表示されるエラー メッセージです。

error: /Users/vagrant/pisi-64bit/tmp/opencv-2.4.5-2/work/opencv-2.4.5/modules/core/src/array.cpp:2482: error: (-206) Unrecognized or unsupported array type in function cvGetMat

本当に助かりました!

4

1 に答える 1

11

OpenCV のドキュメントによると、cv2.line() と cv2.circle() は常に None を返します。http://docs.opencv.org/modules/core/doc/drawing_functions.html

これらのメソッドはインプレース メソッドであるため、渡す最初の引数を変更します。これらのタイプの関数について説明しているこのスタック オーバーフローの質問を参照してください

修正したコードは次のようになります。

#draw the overlaying tracking img
for i,(new,old) in enumerate(zip(good_new,good_old)):
    a,b = new.ravel() #tmp new value
    c,d = old.ravel() #tmp old value

    #draws a line connecting the old point with the new point
    cv2.line(mask,(a,b),(c,d),color[i].tolist(),2) #returns None... why??
    #draws the new point
    cv2.circle(frame,(a,b),5,color[i].tolist(),-1) #returns None... why??

img = cv2.add(frame,mask)
于 2013-11-20T04:09:35.857 に答える