OpenCV: SIFT методы обнаружения и сопоставления
Из документации OpenCV:
C++:void SIFT::operator()(InputArray img, InputArray mask, vector<KeyPoint>& keypoints,
OutputArray descriptors, bool useProvidedKeypoints=false)
Параметры:
img – Input 8-bit grayscale image
mask – Optional input mask that marks the regions where we should detect features.
keypoints – The input/output vector of keypoints
descriptors – The output matrix of descriptors. Pass cv::noArray()
if you do not need them.
useProvidedKeypoints – Boolean flag. If it is true, the keypoint
detector is not run. Instead, the provided vector of keypoints is
used and the algorithm just computes their descriptors.
У меня есть следующие вопросы:
Какие ценности делают
mask
взять на себя? Я имею в виду, если бы я хотел удалить ключевые точки возле границы изображения, я должен дать маску с нулями на границах и единицами в центре?На другой веб-странице я нашел другой метод, который использует метод "обнаружение" для обнаружения ключевых точек и метод "вычисление" для вычисления дескрипторов. В чем разница между использованием функций обнаружения / вычисления и функцией "оператор"? С первым методом я сначала определяю ключевые точки без вычисления дескрипторов... но вместо этого, если я использовал метод "оператор" с
useProvidedKeypoints
флаг, как я должен вычислить ключевые точки раньше?Кроме того, в чем разница между сопоставлением методом грубой силы и сопоставлением FLANN с точки зрения количества совпадающих точек? Мне нужно иметь те же результаты, полученные с помощью
VL_FEAT
библиотека MATLAB... так что я хочу знать, какой из двух методов ближе
например, следующий код Matlab дает мне 2546 обнаруженных ключевых точек
[f1,d1] = vl_sift(frame1_gray);
Использование OpenCV:
std::vector<KeyPoint> keypoints;
cv::SiftFeatureDetector detector;
detector.detect(gray1, keypoints);
cout << keypoints.size() << endl;
всего 708!!!
затем, используя SIFT::operator(), что-то не так в параметрах, которые я даю в качестве ввода
std::vector<KeyPoint> keypoints;
Mat descriptors;
SIFT S = SIFT();
SIFT::operator(gray1, Mat(), keypoints, descriptors);
1 ответ
Давайте ответим на ваши вопросы по очереди:
Маска - это входное изображение, которое вы указываете так, что вы можете контролировать, где происходит определение ключевых точек. Иногда вам не нужно обнаруживать ключевые точки по всему изображению, и вы хотите локализовать, где вы хотите обнаружить ключевые точки, или найти подраздел изображения для захвата ваших ключевых точек. Причина этого заключается в том, что может быть проведена некоторая предварительная обработка для определения значимых областей на вашем изображении. Например, если вы хотите выполнить распознавание лица, вам нужно определять только ключевые точки на лице, а не все изображение. Таким образом, может быть шаг, когда вы сначала получите общее представление о том, где находятся лица на изображении, а затем локализуете обнаружение ключевых точек только для этих областей.
Обнаружение и вычисление, очевидно, две разные вещи. Обнаружение - это определение того, какие позиции пикселей на изображении являются действительными ключевыми точками. Вычисление описывает ключевую точку в этих конкретных местах. Успех детекторов точек интереса заключается не только в том, что они воспроизводимы и достаточно надежны, чтобы их можно было обнаружить, но и в том, что метод описания ключевых точек делает их популярными.
Это намекает на детекторы и дескрипторы соответственно. Существуют платформы, такие как SIFT и SURF, которые являются как средой обнаружения, так и описания. SIFT / SURF вычисляют гистограмму ориентаций (приблизительно) в векторе с 128 ячейками, а также имеют основу обнаружения, основанную на приближении разности гауссианов. Если я могу предложить ссылку, взгляните на эту: Классификация детекторов, экстракторов и сопоставителей - они рассказывают обо всех различных детекторах, дескрипторах, а также о методах сопоставления ключевых точек.
useProvidedKeypoints
(в OpenCV: http://docs.opencv.org/2.4.1/modules/nonfree/doc/feature_detection.html) означает, что вы уже определили расположение пикселей в том месте, где вы хотите вычислить дескрипторы для. Таким образом, SIFT пропустит этап обнаружения алгоритма и просто вычислит дескрипторы для этих положений пикселей.Разница между Brute Force и FLANN (Быстрая библиотека для приблизительных ближайших соседей - http://www.cs.ubc.ca/research/flann/) заключается в механизме сопоставления ключевых точек. Для данной ключевой точки вы хотите определить, соответствует ли эта ключевая точка любой из других ключевых точек, которые были обнаружены в изображении. Одним из способов сделать это является поиск всех ключевых точек (перебор) или подмножество ключевых точек (FLANN). FLANN выполняет поиск ближайшего соседа в многомерном пространстве, чтобы ограничить область поиска ключевых точек. Это, очевидно, будет намного быстрее, чем грубая сила, но все зависит от вашего приложения.