Я использую OpenCV C ++, в VS2010 для приложения распознавания лиц. Для этого я использовал SURF, BruteForceMatcher.
BFMatcher matcher;
vector< DMatch > matches;
//match: execute the matcher!
matcher.match(descriptors1,descriptors2, matches);
Я хочу знать, что именно происходит, когда я вызываю этот метод.
Мой жест «спички» вектор будет заполнен соответствующими ключевыми точками.
А также
Можно ли в любом случае использовать этот вектор «совпадений», чтобы найти подходящие совпадения?
В настоящее время я делаю что-то вроде этого, чтобы получить минимальное расстояние и максимальное расстояние:
for( int i = 0; i < descriptors1.rows; i++ )
{
double dist = matches[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
Если мой вышеупомянутый подход верен, как я могу использовать минимальное расстояние и максимальное расстояние, чтобы проверить, совпадают ли изображения.
Благодарю.
Я был бы признателен, если бы кто-нибудь смог найти это для меня.
Благодарю.
Вы можете попытаться сопоставить изображения с knnMatch()
метод расчета двух ближайших соседей. Для каждого дескриптора на первом изображении у вас будет 2 ближайших совпадения на втором изображении.
Эти совпадения являются двумя лучшими, основанными на расстоянии между их дескрипторами. Если расстояния этих совпадений одинаковы, возможно, вы выберете неправильный. В этом случае вы должны отказаться от этих матчей. Вы можете сделать это, проверив соотношение расстояний.
Если соотношение расстояний между первым совпадением и вторым совпадением не превышает выбранное пороговое значение, вы должны отбросить эти совпадения.
После этого вы можете сделать, например, тест RANSAC, чтобы получить еще лучшие результаты.
SURF функции, как правило, сопоставляются с использованием Быстрый приблизительный поиск ближайшего соседа. На сайте opencv есть руководство по его использованию. Вот.