2016-06-30 5 views
5

Opencvの高密度オプティカルフロー関数の出力を使って、動きベクトルの震源グラフを描こうとしていますが、関数が実際に出力しているものを見つけることができませんでした。OpenCVのDenseオプティカルフロー(Farneback)関数から出力されるものは何ですか?これを使ってPythonでオプティカルフローマップを構築するにはどうすればよいですか?

import cv2 
import numpy as np 

cap = cv2.VideoCapture('GOPR1745.avi') 

ret, frame1 = cap.read() 
prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) 
hsv = np.zeros_like(frame1) 

hsv[...,1] = 255 
count=0 

while(1): 
    ret, frame2 = cap.read() 
    next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY) 
    flow = cv2.calcOpticalFlowFarneback(prvs,next,None, 0.5, 3, 15, 3, 10, 1.2, 0) 
    mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) 

    hsv[...,0] = ang*180/np.pi/2 
    hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) 
    rgb = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) 
    if count==10: 
     count=0 

     print "flow",flow 

    cv2.imshow('frame2',rgb) 
    count=count+1 
    k = cv2.waitKey(30) & 0xff 
    if k == 27: 
     break 
    elif k == ord('s'): 
    prvs = next 

cap.release() 
cv2.destroyAllWindows() 

これは稠密オプティカルフローにOpenCVのチュートリアルで与えられるのと同じコードが有効である:ここではコードです。印刷機能から次の出力を受け取ります。

flow [[[ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    ..., 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00] 
    [ 0.00000000e+00 0.00000000e+00]] 

..., 
[[ -3.54891084e-14 -1.38642463e-14] 
    [ -2.58058853e-14 -1.54020863e-14] 
    [ -5.56561768e-14 -1.88019359e-14] 
    ..., 
    [ -7.59403916e-15 1.16633225e-13] 
    [ 7.22156371e-14 -1.61951507e-13] 
    [ -4.30715618e-15 -4.39530987e-14]] 

[[ -3.54891084e-14 -1.38642463e-14] 
    [ -2.58058853e-14 -1.54020863e-14] 
    [ -5.56561768e-14 -1.88019359e-14] 
    ..., 
    [ -7.59403916e-15 1.16633225e-13] 
    [ 7.22156371e-14 -1.61951507e-13] 
    [ -4.30715618e-15 -4.39530987e-14]] 

これらの値は正確にわかりますか?オリジナルのX、Y座標?最終的なX、Y座標?距離は移動しましたか? pythonで私は承知しています機能がないので、それはオプティカルフローマップをプロットの https://www.getdatajoy.com/examples/python-plots/vector-fields これは、次のとおりです。

は、私は以下のページからコードを使用して矢筒プロットを作ってみると、最初と最後の座標を見つけることを計画しますあなたのために。

ありがとうございます!

答えて

5

あなたはほとんどそこにいました。最初calcOpticalFlowFarneback Documentationを見てみましょう、それはそこに書かれています:

flowからprevとタイプ CV_32FC2と同じサイズを持っている計算フロー画像。

実際には、入力フレームと同じサイズのマトリックスが得られます。 flowマトリックス内の各要素は、prevフレームからのピクセルの変位のを表すポイントです。これは、最後のフレームからデルタxとデルタyを与えるxとyの値(ピクセル単位)でポイントを得ることを意味します。

+1

よかった、ありがとう。したがって、フローマトリックスは元の画像と同じサイズのマトリックスになり、ある位置でその中に格納されたXとYの値は、現在の位置に到達するために移動したXとYの距離になります。だから私がどこから移動したのかを知りたい場合は、フローマトリックスの現在のピクセル位置を使って、移動したXとYの距離を減算するだけです。 –

+0

はい、そうですね。 –

+0

すべてのオプティカルフローアルゴリズムはピクセル単位で出力しますか? – asdf

関連する問題