1

私は機能追跡アプリケーションを開発しています。これまでのところ、ほぼすべての機能検出器/記述子を試した後、ORB で最も満足のいく全体的な結果が得られました。機能記述子と検出器の両方が ORB です。

ソース画像の特徴を検出するために (マスキングによって) 特定の領域を選択しています。その後、後続のフレームで検出された機能と照合します。

次に、次のコードから取得した「一致」に対して比率テストを実行して、一致をフィルタリングします。

std::vector<std::vector<DMatch>> matches1;

m_matcher.knnMatch( m_descriptorsSrcScene, m_descriptorsCurScene, matches1,2 );

また、双方向の比率テスト (ソースから現在のシーンへの一致、およびその逆の一致をフィルター処理し、一般的な一致を除外する) も試しましたが、あまり効果がなかったので、一方向の比率テストに進みました。

また、比率テストに最小距離チェックを追加すると、より良い結果が得られます

if (distanceRatio < m_fThreshRatio && bestMatch.distance < 5*min_dist)
{
    refinedMatches.push_back(bestMatch);
}

そして最後に、ホモグラフィを推定します。

Mat H = findHomography(points1,points2);

RANSAC メソッドを使用してインラインを推定し、それらを使用してホモグラフィを再計算しようとしましたが、不安定性が増し、時間がかかります。

最後に、追跡する特定の領域の周りに長方形を描きます。次の方法で平面座標を取得します。

perspectiveTransform( obj_corners, scene_corners, H);

ここで、「objcorners」は、マスクされた (またはマスクされていない) 領域の座標です。

「scene_corners」で描いた反応角が振動しているようです。機能の数を増やすとかなり減りましたが、時間の制約があるため、あまり増やすことはできません。

どうすれば安定性を向上させることができますか?

任意の提案をいただければ幸いです。

ありがとう。

4

2 に答える 2

1

本当に気になるのが振動である場合は、時間の経過に伴うホモグラフィ行列の移動平均を取ることができます。

cv::Mat homoG = cv::findHomography(obj, scene, CV_RANSAC);
if (homography.empty()) {
    homoG.copyTo(homography);
}
cv::accumulateWeighted(homoG, homography, 0.1);

「homography」変数をグローバルにし、新しいフレームを取得するたびにこれを呼び出し続けます。accumulateWeighted のアルファ パラメータは、移動平均の期間の逆数です。

0.1 は最後の 10 フレームの平均、0.2 は最後の 5 フレームの平均など...

于 2013-10-16T15:41:37.907 に答える
0

特徴検出/照合の経験から思いつく提案は、一致した特徴点を受け入れるだけでは完全に機能しない場合があるということです。見ているシーンの微妙な変化でさえ、光の変化や不要なオブジェクトが視野に入ってくるなど、やや厄介な問題を引き起こす可能性があります。

あなたの言うことから、適切に機能する機能が適切に機能しているように見えます。関心領域を一定に保つ方法に取り組みたいと思うかもしれません。フレーム間で追跡しようとしているオブジェクトに固有の典型的な速度やその他の動きのパターン、またはカメラの位置に関連する制約がわかっている場合は、関心領域を不必要に再計算して振動を引き起こすのを避けるのに役立つ場合があります。または、実際には、より効率的な検索アルゴリズムを作成するのに役立ち、検出して使用できる特徴点の数を増やすことができます。

使用できるもう 1 つの (小さな) ハックは、前のウィンドウのサイズと位置が似ていた場合に領域ウィンドウを再描画しないようにすることです。

于 2013-07-22T14:22:36.030 に答える