2012-03-21 3 views
0

У меня немного запутанная ситуация при использовании дескрипторов SIFT реализация от OpenCV.OpenCV (C++) с использованием дескрипторов SIFT увеличивает количество обнаруженных функций?

Я пытаюсь протестировать различные методы определения детектора признаков + дескриптора, поэтому я использую сочетание интерфейсов 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 для выявления ключевых точек, и затем пытается вычислить просеять дескрипторы, но то же самое увеличение размера также происходит с сТАР, SURF и просеять (т.е. DoG). Я не пытался изменить дескриптор SIFT на что-то еще, но если кто-то подумает, что он имеет отношение к вопросу, я попробую его и отредактирую его в моем вопросе.

+0

Вы можете добавить часть кода, который используете? Полезно знать параметры. – Alex

+0

Ух ... Я на самом деле делаю обертки вокруг обертки для кода OpenCV, но я попытаюсь выкопать фактические 5 строк кода, которые выполняют всю работу под всем этим и редактируют его. – penelope

ответ

2

Похоже, что это связано с OpenCV с использованием реализации SIFT Роба Гесса, которая иногда дублирует ключевые точки с более чем одной доминирующей ориентацией.

Оглядываясь на обнаруженные ошибки OpenCV, этот вопрос был получен here.

Это не ошибка, поведение не было исправлено в новых версиях, а вместо этого было задокументировано. Поскольку я обязан версии OpenCV, которую я использую прямо сейчас (v2.1), мне не приходило в голову смотреть на newer documentation для дополнительного поведения, так как поведение, описанное в old one, имело смысл для меня.

5

Прежде всего, как вы можете видеть в documentationcv::DescriptorExtractor::compute принять std::vector<cv::Keypoints> в аргументе, который в non const. Это означает, что этот вектор может быть изменен на cv::DescriptorExtractor::compute. На практике к вектору будут применены KeyPointsFilter::runByImageBorder и KeyPointsFilter::runByKeypointSize (две функции non-const) и удалит ключевую точку, для которой дескриптор не может быть вычислен. Никакого повторного извлечения ключевых точек не будет. Вы должны опубликовать несколько строк кода, который вы используете для дальнейшей диагностики.

-

Ну, я, наконец, нашел, где проблема возникает: cv::SiftDescriptorExtractor::compute метод вызывает SIFT::operator() который (повторно) вычислить ориентацию функций, а также дублирует пункты с несколькими доминирующими ориентациями. Решение может заключаться в изменении descriptorParams.recalculateAngles на false.

+0

Я знаю почему функция ':: compute' разрешена для изменения' std :: vector 'и что означает' non const'. Причина, по которой они приводятся в документации, - это (и я цитирую) «Ключевые точки. Ключевые точки, для которых дескриптор не может быть вычислен, удаляются». И удаление в порядке. Но когда мои ключевые моменты завершают процесс, есть * больше * из них, а не * меньше *, и это то, что я не могу понять. Я также опубликовал какой-то реальный код, чтобы лучше понять, что такое распечатка. – penelope

+0

Я хотел прояснить это, чтобы полностью понять вашу проблему. Без кода трудно диагностировать. Я попробовал код, который вы отредактировали, и у меня есть другой тип DesciptorExtractor. Кажется, что проблема возникает только с дескриптором Sift. – Eric

+0

Да, я сам дал ответ со ссылками на старую и новую документацию, а также на страницу, на которой сообщалось о проблеме. Сначала я не публиковал код, потому что меня больше интересовало * почему * это происходит (каким образом имеет смысл, что извлечение дескрипторов SIFT увеличило количество ключевых точек), чем в том, где именно в коде это происходило точно. – penelope

0

Это не ошибка, но дизайн:

SIFT возвращает несколько точек интереса в том же месте с различной ориентацией, если четко не единственной доминирующая ориентация. Обычно оценивается до трех (в зависимости от фактического патча изображения).

Смежные вопросы