Использование openCV для реализации SIFT в изображении

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

  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. Я хочу изменить метод, который я использую для сопоставления с изображением, поэтому мне нужно извлечь дескриптор и доминирующую ориентацию каждой ключевой точки. Как извлечь дескриптор каждой ключевой точки и доминирующую ориентацию?

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


person Kuo    schedule 04.12.2014    source источник


Ответы (2)


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

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

Вы можете найти полезную информацию о параметрах SIFT в реализации 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, один дескриптор.

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

person zedv    schedule 04.12.2014
comment
Я искал другую статью и реализовал SIFT с помощью openCV. И я использую cv::SIFT sitDetectorExtractor = cv::SIFT(0, 3, 0.04, 10, 1.6); и siftDetectorExtractor(tmp,cv::Mat(), keypoints1, sifts1);. Однако, когда я хочу узнать координацию ключевой точки, я использую keypoints1[0].pt, и результат не является целым числом. Почему? Изображение цифровое, поэтому координация ключевой точки должна быть целочисленной. - person Kuo; 05.12.2014
comment
Кроме того, я получил доступ к дескриптору первой ключевой точки с помощью sifts1.at‹float›(0,0) до sifts1.at‹float›(0,127). Могу ли я изменить порядок sifts1.at‹float›(0,0) на sifts1.at‹float›(0,127) и другие дескрипторы ключевых точек перед сопоставлением? Или его порядок начинается с доминирующей ориентации и автоматически заканчивается доминирующей ориентацией? Поэтому я могу напрямую использовать результат для сопоставления. - person Kuo; 05.12.2014
comment
Кроме того, я все еще не могу найти значение параметра в экстракторе cv::SiftDescriptorExtractor(); Ваш ответ очень помогает мне в учебе. Спасибо вам большое за ваш ответ. - person Kuo; 05.12.2014
comment
1. что вы имеете в виду под координацией? Когда вы используете keypoints1[0].pt, вы получаете координаты ключевой точки (в структуре Point2f), а не целое число. 2. После обнаружения ключевых точек (с помощью SiftFeatureDetector) необходимо вычислить для них дескрипторы (с помощью SiftDescriptorExtractor). После этого вы должны использовать сопоставитель для соединения ближайших ключевых точек в каждом изображении (если это так). - person zedv; 06.12.2014
comment
1. Но координата или положение ключевой точки на цифровом изображении должны быть целыми. Почему целое число? 2. Я не понимаю, как использовать SiftDescriptorExtractor, ссылка используйте параметр 3.0. В чем смысл этого параметра? Я не могу найти этот параметр в статье, написанной Лоу. - person Kuo; 06.12.2014

  • Детектор cv::SiftFeatureDetector( 0.05, 5.0 ), первый параметр — порог контрастности. Это минимальное количество контраста, чтобы принять ключевую точку. Второй параметр — это порог отклонения края. Если вы хотите получить больше возможностей, вы должны увеличить 1-й параметр и/или уменьшить 2-й параметр.
  • cv::SiftDescriptorExtractor Extractor( 3.0 ), параметр — это значение увеличения, размер дескриптора определяется путем умножения шкалы ключевых точек на это значение. Использование параметра с префиксом допустимо.

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

person thunderY    schedule 10.02.2016