2

feature を追跡し、ホモグラフィを計算し、3D-2D ポイント対応からオブジェクトのポーズを取得し、それを使用して 3D オブジェクトをレンダリングする AR アプリケーションを作成しています。

ソース画像の特徴を検出するために (マスキングによって) 特定の領域を選択しています。次に、後続のフレームで検出された特徴と照合します。次に、それらの一致をフィルタリングし、マスクされていない領域のホモグラフィを推定します。

問題は、ホモグラフィ推定にあります。毎回異なります(ごくわずかですが、それでも異なります)。効果は次のとおりです。カメラを静止させても、追跡された領域の周りに振動する長方形が得られます。これは、推定されたホモグラフィを使用して描画されます。

ORBを使用した不安定なホモグラフィ推定というタイトルの質問をすでに投稿し、 検討していた事実を再確認しました(領域の位置が最後の位置に似ている場合、ホモグラフィを再計算しません)。

しかし、私は最近、カルマン フィルターについて知りました。カルマン フィルターは、以前の知識と測定観測を組み合わせることで、位置をより正確に推定できるということです。

そのため、さまざまな例 (特にhttp://www.youtube.com/watch?v=GBYW1j9lC1I ) を見た後、カルマン フィルター (四角形領域のすべての点に 1 つずつ) をモデル化しました。 :

m_KF1.init(4, 2, 1); 
setIdentity(m_KF2.transitionMatrix);
m_measurement1 = Mat::zeros(2,1,cv::DataType<float>::type);
m_KF1.statePre.setTo(0);
m_KF1.controlMatrix.setTo(0);

//initialzing filter 
m_KF1.statePre.at<float>(0) = m_scene_corners[1].x; //the first reading
m_KF1.statePre.at<float>(1) = m_scene_corners[1].y;
m_KF1.statePre.at<float>(2) = 0;
m_KF1.statePre.at<float>(3) = 0;

setIdentity(m_KF1.measurementMatrix);
setIdentity(m_KF1.processNoiseCov,Scalar::all(.1)) //updated at every step
setIdentity(m_KF1.measurementNoiseCov, Scalar::all(4)); //assuming measurement error of      
                                                        //not more than 2 pixels
setIdentity(m_KF1.errorCovPost, Scalar::all(.1)); 

4 つの状態変数 (x、y の位置と x、y の速度)。

2 つの測定変数 (x、y の位置)

1 つの制御変数 (加速度)

反復ごとに実行される次の手順

//---First,the predicion phase , to update the internal variables-------//

// 'dt' is the time taken between the measurements

//Updating the transitionMatrix
m_KF1.transitionMatrix.at<float>(0,2) = dt;
m_KF1.transitionMatrix.at<float>(1,3) = dt;

//Updating the Control matrix
m_KF1.controlMatrix.at<float>(0,1) = (dt*dt)/2;
m_KF1.controlMatrix.at<float>(1,1) = (dt*dt)/2;
m_KF1.controlMatrix.at<float>(2,1) = dt;
m_KF1.controlMatrix.at<float>(3,1) = dt;

//Updating the processNoiseCovmatrix
m_KF1.processNoiseCov.at<float>(0,0) = (dt*dt*dt*dt)/4;
m_KF1.processNoiseCov.at<float>(0,2) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(1,1) = (dt*dt*dt*dt)/4;
m_KF1.processNoiseCov.at<float>(1,3) = (dt*dt*dt)/2;

m_KF1.processNoiseCov.at<float>(2,0) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(2,2) = dt*dt;

m_KF1.processNoiseCov.at<float>(3,1) = (dt*dt*dt)/2;
m_KF1.processNoiseCov.at<float>(3,3) = dt*dt;

Mat prediction1 = m_KF1.predict();
Point2f predictPt1(prediction1.at<float>(0),prediction1.at<float>(1));

// Get the measured corner
m_measurement1.at<float>(0,0) = scene_corners[0].x;
m_measurement1.at<float>(0,1) = scene_corners[0].y;

//----Then, the correction phase which uses the predicted value and our measured value

Mat estimated = m_KF1.correct(m_measurement1);
Point2f statePt1(estimated.at<float>(0),estimated.at<float>(1));

このモデルは私の測定値をほとんど修正しません

今私の質問は:

  1. カルマン フィルターは私のシナリオに適していますか? より良い結果が得られますか?
  2. もしそうなら、何が欠けていますか?私はそれを正しくモデリングしていますか?長方形の 4 つのポイントに対して 4 つのフィルターを作成する代わりに、他の方法でモデル化する必要があります (たとえば、距離に基づいて最も強い 10 個の一致を取得し、それらをフィルターへの入力として使用します)。
  3. カルマン フィルターが適していない場合、推定されたホモグラフィをより安定させるために他に何ができますか?

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

1

この質問のタイトルは不適切であり、説明を読んだ後、あなたが本当に尋ねているのは、「なぜ私の OpenCV カルマン フィルターはまだ多くのノイズを残すのですか?

とにかくあなたの答えは:

  1. はい、カルマンはあなたのシナリオで動作します
  2. 間違った使い方をしている
  3. 変更: KF.processNoiseCov、ここからコードを取得できます:新しい観測なしの Opencv kalman フィルター予測それを説明する素敵な行があります。

見る:

 setIdentity(KF.processNoiseCov, Scalar::all(.005)); //adjust this for faster convergence - but higher noise

私が見る限り、あなたはそれについて非常に基本的な理解を持っています。単純なアプローチに進み、4 つの 2D カルマン フィルターを使用できます。これには、次のコードを使用できます。そこから成長し、理解が深まるまで適応します。

その後、問題にさらに近づけてモデル化するか、4 つのフィルターを使い続けることができます。「完璧な」実装はありません。

于 2015-03-02T06:31:03.730 に答える