0

descriptor_extractor_matcher.cpp サンプルで次のコードを使用して、img1 の記述子 (Mat descriptors01) を計算し、それをディスクに書き込んでロードし直します (Mat descriptors1)。(キーポイントの手順は同じですが、コードはほとんど同じです...)

    Ptr<DescriptorExtractor> descriptorExtractor = DescriptorExtractor::create( argv[2] );

...

Mat descriptors01;
descriptorExtractor->compute( img1, keypoints1, descriptors01 ); // compute descriptors

FileStorage storage("test.yml", FileStorage::WRITE);             //save it to disc
storage << "blub" << descriptors01;
storage.release();

Mat descriptors1;
FileStorage storage1("test.yml", FileStorage::READ);            // load it again
storage1["blub"] >> descriptors1;
storage1.release();

画像 2 のキーポイントと記述子が計算され、保存および読み込みなしで使用されます。

マッチングのために画像 1 にロードされたデータ (キーポイントと記述子) のみを使用しているため、記述子: descriptors1.

ケースを比較すると、
A) 上記のコードを使用して、計算、保存、および読み込みを行います。
B) 読み込まれたデータのみを使用する (計算を行わずに再度保存する)

キーポイントの写真と一致する記述子の写真でわかるように、一致については異なる結果が得られます。違いはないと思います...ここで何が欠けていますか? 2 つの画像を比較する必要がありますが、画像を保存されている一連のキーポイントとその記述子と比較することはできませんか?

もちろん、[detectorType] [descriptorType] [matcherType] [matcherFilterType] [image1] [image2] [ransacReprojThreshold] にも同じ値を使用しています ;)

どうもありがとう!

更新

問題は記述子に依存しているようです。ロードされた記述子の操作は、SIFT と SURF では機能しますが、ORB とその他では機能しません。画像: ケース A と B の記述子が異なる結果:

ここに画像の説明を入力

4

1 に答える 1

0

A または B を個別に繰り返してみて、結果が同じになるかどうかを確認します。私は彼らがそうしないと思います.1あなたの関心のあるオブジェクトはテクスチャが貧弱であり、記述子が貧弱になるからです。#2 2つの画像間の視点の変化は大きく、SIFTのような最良の記述子であっても再現性がないという問題につながります。

ここで、この再現性の問題を解決する方法の一部になります。#1 記述子のノルムに何らかのしきい値を使用して、非常に強力な特徴のみが照合に使用されるようにします。#2 RANSACとともにエピポーラ制約を使用して、間違った一致を除外します。フィルターが通信にどのように大きな影響を与えるかを示すために、2 つの画像を添付します。 ここに画像の説明を入力 SURF を使用して 2 つの画像 (赤とシアンのカラーマップの 2 つの画像) 間の対応を見つける ここに画像の説明を入力 エピポーラ制約を使用して RANSAC を使用して画像をフィルター処理した後。

この問題について、自由にコメントして議論してください。:-)

于 2014-10-30T20:00:10.170 に答える