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));
このモデルは私の測定値をほとんど修正しません
今私の質問は:
- カルマン フィルターは私のシナリオに適していますか? より良い結果が得られますか?
- もしそうなら、何が欠けていますか?私はそれを正しくモデリングしていますか?長方形の 4 つのポイントに対して 4 つのフィルターを作成する代わりに、他の方法でモデル化する必要があります (たとえば、距離に基づいて最も強い 10 個の一致を取得し、それらをフィルターへの入力として使用します)。
- カルマン フィルターが適していない場合、推定されたホモグラフィをより安定させるために他に何ができますか?
どんな助けでも大歓迎です。ありがとう。