2012-06-19 15 views
5

私はOpenCVのPyramid Lukas Kanade関数を使ってオプティカルフローを推定しています。私はcvGoodFeaturesToTrackを呼び出し、次にcvCalcOpticalFlowPyrLKを呼び出します。これは私のコードです:opencvを使ったオプティカルフロー

while(1) 
{ 
... 

cvGoodFeaturesToTrack(frameAth,eig_image,tmp_image,cornersA,&corner_count,0.01,5,NULL,3,0.4); 

std::cout<<"CORNER COUNT AFTER GOOD FEATURES2TRACK CALL = "<<corner_count<<std::endl; 

cvCalcOpticalFlowPyrLK(frameAth,frameBth,pyrA,pyrB,cornersA,cornersB,corner_count,cvSize(win_size,win_size),5,features_found,features_errors,cvTermCriteria(CV_TERMCRIT_ITER| CV_TERMCRIT_EPS,20,0.3),CV_LKFLOW_PYR_A_READY|CV_LKFLOW_PYR_B_READY); 

cvCopy(frameBth,frameAth,0); 
... 
} 

frameAthは、前の灰色のフレームであるとframeBthは、ウェブカメラから現在の灰色のフレームです。しかし、私が各フレームで追跡する良い機能の数を出力すると、その数は合計時間後に減少し、減少し続けます。しかし、私はプログラムを終了し、(ウェブカメラの視野を妨げることなく)コードを再度実行する場合、多くのポイントが追跡する良い機能として表示されます...どのように同じ視野と同じシーンの数は点数にそのような差を与えます...そして、差は高いです..4分の実行後に追跡する良好な特徴としてのポイントの数は20または50です...しかし、同じプログラムが終了したとき再度実行された番号は500から700の初期値ですが、再びゆっくりと減少します。私はopenCVを使って過去4ヶ月間オープンしています。openCVへの新しいllです。ガイドを私に教えてください。

答えて

1

cvGoodFeatureToTrackを呼び出し、corner_countを参照して呼び出しています。特徴量が少なくなればその値は減少する。 whileループの各反復でcvGoodFeaturesToTrackを呼び出す前に、corner_countの値を初期値にリセットする必要があります。

+0

@ sgar91 ... thanx ...あなたの提案でパフォーマンスが改善しました –

+0

私はずっと前に同じ問題を経験しました。 – sgarizvi

+0

@rotating_imageこの回答が受け入れられたとチェックされた理由はわかりません。機能の数をリセットすると、 'cvCalcOpticalFlowPyrLK'をまったく呼び出すことは意味がありません。それはあなたがそれを呼び出さないと同じ結果を与えるでしょう...まずはドキュメントを読む。 – ArtemStorozhuk

6

cvCalcOpticalFlowPyrLKを使用して、これらの機能をトラッキングし、トラッキングするのに適した機能を検出するには、cvGoodFeaturesToTrackを最初に(最初のループの前に)呼び出す必要があります。デフォルトのopencvの例を見てみましょう:OpenCV/samples/cpp/lkdemo.cpp

+0

@Astor ... thanx Astorのクイックレスポンス...あなたが言ったプロセスは、視界の中の動いているオブジェクトを追跡するためにうまくいきます...しかし、私はカメラの動きを推定するためにオプティカルフローを使用しています。カメラが動いている視界が変化しているシーンの詳細もゆっくりと変化しています...もし私がgoodfeaturestotrackを呼んでいたら、シーンがゆっくりと変化しているとき、私は新しいポイントを得ていません。初期ポイントは存在しないかもしれません新しいフレームで... –

+0

@ user1466741カメラの動きを検出するには、[フレーム減算](http://www.youtube.com/watch?v=KREoXEy9ojY)を使用してモーション検出を使用できます。このアルゴリズムは非常に簡単です.2つの一貫性のあるフレームを差し引いてしきい値を設定し、動きの領域(ビデオ上の白いピクセル)が大きいか(全領域の80%か何か)、カメラが動いているかどうかを確認する必要があります。しかし、このアルゴリズムは、イルミナニオンが変化しているとき(ライトをオン/オフにするとき)、または誰か(または何か)がカメラに非常に接近しているときには、悪いものです。 – ArtemStorozhuk

+0

@Astor ...アイデアのための... thanxオプティカルフローでは、私は動きの方向と大きさを簡単に得ることができます... goodfeaturestotrack関数を定期的に呼び出す(フレーム数が一定数を超えたときやgoodpoints2trackの数が減ったとき)解決する問題は?つまり、追跡するポイントをリフレッシュし続けると... –

関連する問題