OpenCV のSIFT 記述子の実装を使用しているときに、少し混乱する状況があります。
さまざまな機能検出器と記述子の計算方法をテストしようとしているので、さまざまな検出器の方法と記述子を簡単に変更できるcv::FeatureDetector
とインターフェイスの組み合わせを使用しています。cv::DescriptorExtractor
cv::DescriptorExtractor::compute(...)
(単一の画像のバリアント)を呼び出すと、記述子を計算できない場合、アルゴリズムに与えられるキーポイントの数が減少する可能性があるとドキュメントに記載されており、それがどのように、なぜ行われるのかを理解しています。
しかし、実際には、ディスクリプタ計算後のキー ポイントの数が増加します。それは明らかにそうであり、私はそれが起こるのを止めようとしているわけではありません.理由についての説明を望んでいます.
コードを持たない実際の OpenCV の周りにラッパーのレイヤーを何層も重ねています (いくつかのローカルの非 OpenCV フラグを設定するだけです)。
cv::Ptr<cv::FeatureDetector> dect = cv::FeatureDetector::create("MSER");
cv::Mat input = cv::imread("someImg.ppm", 0);
std::vector<cv::KeyPoint> keypoints;
dect->detect(input, keypoints);
cv::Ptr<cv::DescriptorExtractor>deEx=cv::DescriptorCalculator::create("SIFT");
std::cout << "before computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features
cv::Mat desc;
deEx->compute(input, keypoints, desc);
std::cout << "after computing, feats size " << keypoints.size() << std::endl;
// code to print out 10 features
記述子の計算の直前と直後の最初の 10 個のキー ポイントを出力したので、例としていくつかの具体的な数値を示します。
before computing, feats size 379
feat[0]: 10.7584 39.9262 176.526 0 12.5396
feat[1]: 48.2209 207.904 275.091 0 11.1319
feat[2]: 160.894 313.781 170.278 0 9.63786
feat[3]: 166.061 239.115 158.33 0 19.5027
feat[4]: 150.043 233.088 171.887 0 11.9569
feat[5]: 262.323 322.173 188.103 0 8.65429
feat[6]: 189.501 183.462 177.396 0 12.3069
feat[7]: 218.135 253.027 171.763 0 123.069
feat[8]: 234.508 353.236 173.281 0 11.8375
feat[9]: 234.404 394.079 176.23 0 8.99652
after computing, feats size 463
feat[0]: 10.7584 39.9262 13.1313 0 12.5396
feat[1]: 48.2209 207.904 69.0472 0 11.1319
feat[2]: 48.2209 207.904 107.438 0 11.1319
feat[3]: 160.894 313.781 9.57937 0 9.63786
feat[4]: 166.061 239.115 166.144 0 19.5027
feat[5]: 150.043 233.088 78.8696 0 11.9569
feat[6]: 262.323 322.173 167.259 0 8.65429
feat[7]: 189.501 183.462 -1.49394 0 12.3069
feat[8]: 218.135 253.027 -117.067 3 123.069
feat[9]: 218.135 253.027 7.44055 3 123.069
この例から、元のfeat[1]
とfeat[7]
がそれぞれ 2 つの新しいキー ポイントにまたがっていることがわかりますが、それを行うcompute
方法についての論理的な説明は見当たりません :(
ここに示したプリントアウトは、キーポイントの検出にMSERを使用してからSIFT記述子を計算しようとしたものですが、検出されたSTAR、SURF、およびSIFT (つまり DoG) キーポイントでも同じサイズの増加が発生します。SIFT記述子を別のものに変更しようとはしませんでしたが、質問に関連していると誰かが考えた場合は、それを試して質問で編集します。