3

特徴検出には SIFT を使用し、画像の特徴追跡には calcOpticalFlowPyrLK を使用しています。Microsoft kinect から取得した低解像度画像 (トリミング後 590x375) に取り組んでいます。

// feature detection
cv::Ptr<Feature2D> detector = cv::xfeatures2d::SIFT::create();
detector->detect(img_1,keypoints_1);
KeyPoint::convert(keypoints_1, points1, vector<int>());

// feature tracking
vector<float> err;
Size winSize=Size(21,21);
TermCriteria termcrit=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS, 30, 0.01);
calcOpticalFlowPyrLK(img_1, img_2, points1, points2, status, err, winSize, 1, termcrit, 0, 0.001);

これを、同じカメラ位置から 30fps の速度で撮影した安定したシーンの連続した画像 (アイデアを得るために) で実行しました。目には、画像は同じように見えますが、なぜか calcOpticalFlowPyrLK はある画像から別の画像へ同じ特徴を追跡できません。位置 (x,y 座標) は、検出されたフィーチャと追跡されたフィーチャで同じである必要があります。どういうわけかそうではありません。

AldurDisciple の提案によると、ノイズを特徴として検出していると思います。下の黒い画像は、導電要素間の違いであり、ノイズを示しています。次は元の画像で、次に特徴が検出された画像です。

私の目標は、情報を使用して、時間の経過に伴うロボットの位置の変化を見つけることです。

使った

GaussianBlur( currImageDepth, currImageDepth, Size(9,9), 0, 0); 

ノイズのためにしかし、それは助けにはなりませんでした。

ここで完全なコードを見つけてください ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

ここに画像の説明を入力

4

1 に答える 1

3

考慮すべき要素は次の 2 つだと思います。

  1. シーンは基本的に 3 つの均一な領域で構成されているため、これらの領域の FAST ポイントは画像のノイズによって生成される可能性があります。連続する 2 つの画像ではノイズ パターンが完全に異なる可能性があるため、一部のポイントの最適な一致は、画像内の完全に異なる位置にある可能性があります。

  2. 画像の解像度はすでに非常に低く、関数3のパラメーター リストにある は、calcOpticalFlowPyrLK関数が 4 レベルのピラミッドを使用してポイントを追跡する必要があることを意味します。これは、ポイントが最初に係数 2^3 = 16 でサイズ変更された画像 (つまり ~ 36x23 画像) で追跡され、次に係数 2^2 = 8 でサイズ変更された画像 (つまり ~ 73x46 画像) で追跡されることを意味します。 . 36x23 の初期解像度は、テクスチャがほとんどない画像には低すぎます。

問題を解決するには、ピラミッド レベルを 2 つだけ (つまり、1の代わりにパス3)、または 1 つのレベル (つまり、 の0代わりにパス) を使用してみてください3。ただし、ノイズの問題は、一般に、常にいくつかの誤った一致が発生することを意味することに注意してください。

一方、カメラの動きのない静的なシーンでポイントを追跡することは、人為的な問題のように思えます。実際のシナリオでは、移動するカメラを使用してシーンまたは静的シーンのモーションを追跡することに関心があると思われます。この場合、複数のピラミッド レベルを使用すると便利です。

于 2016-11-05T14:30:32.817 に答える