Лучший способ сопоставления дескрипторов FREAK?
Поэтому я подаю заявку с использованием детекторов FAST и дескрипторов FREAK. Когда дело доходит до сопоставления, я хотел использовать сопоставление BRUTEFORCE_HAMMING, но я не получаю ожидаемых результатов (дает больше совпадений с изображениями, которые не имеют ничего общего с оригиналом, чем изображения, которые выглядят одинаково)
Я пробовал следующий код
MatOfDMatch matches = new MatOfDMatch();
matcher = DescriptorMatcher.create(DescriptorMatcher.BRUTEFORCE_HAMMING);
matcher.match(descriptors,descriptors1,matches);
MatOfDMatch goedematches = new MatOfDMatch();
double max_dist = 0;
double min_dist = 100;
//if (descriptors.cols() == descriptors1.cols())
//{
for( int i = 0; i < descriptors.rows(); i++ )
{ double dist = matches.toArray()[i].distance;
if( dist < min_dist ) min_dist = dist;
if( dist > max_dist ) max_dist = dist;
}
// should only draw good matches
for( int i = 0; i < descriptors.rows(); i++ )
{ MatOfDMatch temp = new MatOfDMatch();
if( matches.toArray()[i].distance <= 2*min_dist )
{ temp.fromArray(matches.toArray()[i]);
goedematches.push_back(temp);
}
// }
}
Log.d("LOG!", "Number of good matches= " + goedematches.size());
Но это возвращает "плохие" результаты. Итак, мой вопрос: есть ли другие способы сделать это сопоставление с дескрипторами FREAK? (Я использую библиотеку OpenCV 2.4.4 и оболочку Java, поэтому C-код отсутствует)
3 ответа
Когда у вас есть дескрипторы, подход грубой силы даст вам наиболее близкие соответствия, которые вы можете найти, поскольку он пытается сопоставить дескриптор на первом изображении со всеми дескрипторами второго изображения.
Таким образом, ответ - нет: с дескрипторами FREAK наилучшие результаты, которые вы можете получить (с расстоянием Хэмминга), - это те, которые вы получите при сопоставлении методом грубой силы.
(Это говорит о том, что вы должны получать много хороших и плохих совпадений, когда изображения похожи. Вы пытались нарисовать совпадения? Попробуйте провести линии между совпадениями без использования шага фильтрации.)
Вы можете получить плохие результаты, потому что FREAK не является вращением и масштабируется самостоятельно. Попробуйте использовать определение ключевых точек BRISK и дескрипторы FREAK вокруг этих ключевых точек.
JavaCV позволяет использовать обнаружение ключевых точек BRISK, если для дескриптора mat задано значение null.
Если вы проверяете дублирование изображений, я бы предложил вам использовать BRISK
Алгоритм с расстоянием Хэмминга 10
, Я использую это в своем приложении и разработал инструмент, который поможет вам найти наилучший алгоритм. Возможно, вы можете обновить инструмент, который я разработал, с соответствующими типами.