У меня немного запутанная ситуация при использовании реализации дескрипторов SIFT из OpenCV.
Я пытаюсь протестировать различные методы расчета детектора признаков + дескриптора, поэтому я использую комбинацию интерфейсов cv::FeatureDetector
и cv::DescriptorExtractor
, которые позволяют мне просто переключаться между различными методами обнаружения и дескрипторами.
При вызове cv::DescriptorExtractor::compute(...)
(вариант для одиночного изображения) в документации сказано, что возможно количество ключевых точек, отдаваемых алгоритму, уменьшаться, если невозможно вычислить их дескрипторы, и я так понимаю как и зачем это делается.
Но что происходит со мной, так это то, что количество ключевых точек после вычислений дескриптора фактически увеличивается. Это явно так, и я не пытаюсь предотвратить это, я просто надеюсь на объяснение, почему (просто интуитивное описание было бы круто, хотя я ценю что-то большее).
У меня есть слои за слоями оболочек вокруг фактического OpenCV, которые не имеют никакого кода (просто устанавливаю некоторые локальные флаги, отличные от 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]
расширились до двух новых ключевых точек каждая, но я не вижу никакого логического объяснения тому, как метод compute
делает это :(
Распечатка, которую я привел здесь, получена при использовании MSER для обнаружения ключевых точек, а затем при попытке вычислить дескрипторы SIFT, но такое же увеличение в размере также происходит с обнаруженными ключевыми точками STAR, SURF и SIFT (т.е. DoG). Я не пытался изменить дескриптор SIFT на что-то другое, но если кто-то считает, что это имеет отношение к вопросу, я попробую и отредактирую его в своем вопросе.