2014-12-04 4 views
0

Я попытался реализовать SIFT с openCV, и я ссылаюсь на эти ссылки link1 и link2. Кроме того, я также прочитал статью о SIFT, написанную Лоу. У меня есть некоторые проблемы с кодом в link1 и link2.Использование openCV для реализации SIFT на изображении

  1. cv :: SiftFeatureDetector детектор (0,05, 5,0); cv :: Экстрактор SiftDescriptorExtractor (3.0);

    Я не могу полностью понять параметр в приведенной выше функции. Если я изменяю первую функцию на cv :: SiftFeatureDetector детектора (0,05, 10,0); , есть время работы OpenCV Error: Assertion failed < firstOctave> = - 1 %% actualNLayers < = nOctaveLayers>.

    Кроме того, я не понимаю параметр в экстракторе SiftDescriptorExtractor(). Я знаю, что есть соотношение расстояний в сопоставлении ключевых точек, но диапазон [0,1].

  2. Я хочу изменить метод, который я использую, чтобы соответствовать изображению, поэтому мне нужно извлечь дескриптор и доминирующую ориентацию каждой ключевой точки. Как извлечь каждый дескриптор каждой ключевой точки и доминирующую ориентацию?

Большое спасибо за ваш ответ.

ответ

3

Мой совет заключается в том, что вы должны использовать параметры SIFT по умолчанию в начале. Затем, если вы не удовлетворены результатами, вы можете попытаться уточнить эти параметры.

Ptr<FeatureDetector> detector = new SIFT();; 
Ptr<DescriptorExtractor> extractor = new SIFT(); 

U можно найти полезную информацию о параметрах просеять в реализации OpenCV здесь: http://docs.opencv.org/modules/nonfree/doc/feature_detection.html

вычислить ключевые точки:

vector<KeyPoint> keypoints; 
detector->detect(yourImage, keypoints); 

При вычислении ключевых точек его ориентация автоматически вычисляется и связанный с параметром «угол» каждой ключевой точки. Вы можете найти больше информации здесь: http://docs.opencv.org/modules/features2d/doc/common_interfaces_of_feature_detectors.html

Для вычисления дескрипторов ключевых точек:

Mat descriptors; 
extractor->compute(yourImage, keypoints, descriptors); 

будет каждая строкой Mat дескрипторы одного дескриптора.

Пожалуйста, дайте мне знать, если у вас есть вопросы! Надеюсь, это поможет.

+0

Я искал другие статьи и осуществлять просеять по OpenCV.И я использую cv :: SIFT siftDetectorExtractor = cv :: SIFT (0, 3, 0.04, 10, 1.6); и siftDetectorExtractor (tmp, cv :: Mat(), keypoints1, sifts1) ;. Однако, когда я хочу знать координацию ключевой точки, я использую keypoints1 [0] .pt, и результат не является целым числом. Зачем? Изображение цифровое, поэтому координация ключевой точки должна быть целочисленной. – Kuo

+0

Кроме того, я получил доступ к дескриптору первой ключевой точки по sifts1.at (0,0) до sifts1.at (0,127). Могу ли я повернуть порядок sifts1.at (0,0) на sifts1.at (0,127) и дескриптор других ключевых точек перед сопоставлением? Или его порядок начинается с доминирующей ориентации и автоматически заканчивается с доминирующей ориентацией? Поэтому я могу напрямую использовать результат для соответствия. – Kuo

+0

Кроме того, я все еще не могу найти значение параметра в cv :: SiftDescriptorExtractor extractor(); Вы ответите мне очень много в моем кабинете. Спасибо вам большое за ваш ответ. – Kuo

1
  • cv :: SiftFeatureДетектор детектора (0,05,0,0), первый параметр - порог контрастности. Это минимальный контраст, чтобы принять ключевую точку. Второй параметр - порог отклонения края. Если вы хотите получить больше функций, вы должны увеличить 1-й параметр и/или уменьшить второй параметр.
  • cv :: Экстрактор SiftDescriptorExtractor (3.0), параметр является значением magnificaiton, размер дескриптора определяется путем умножения шкалы ключевой точки на это значение. Использование префикса param - это нормально.

Для получения дополнительной информации: http://docs.opencv.org/2.3/modules/features2d/doc/common_interfaces_of_descriptor_extractors.html

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