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 の記述子が異なる結果: