2016-01-04 4 views
4

Я пытаюсь найти простой алгоритм для поиска соответствия между двумя наборами 2D-точек (регистрация). Один набор содержит шаблон объекта, который я бы хотел найти, а второй набор содержит точки, принадлежащие интересующему объекту, но он может быть шумным (отсутствующие точки, а также дополнительные точки, которые не принадлежат объекту) , Оба набора содержат примерно 40 точек в 2D. Второй набор представляет собой гомографию первого набора (перевод, поворот и преобразование перспективы).Простой алгоритм регистрации для небольших наборов двумерных точек

Меня интересует поиск алгоритма регистрации для получения точечного соответствия. Я буду использовать эту информацию, чтобы найти преобразование между двумя наборами (все это в OpenCV).

Может ли кто-нибудь предложить алгоритм, библиотеку или небольшой бит кода, который мог бы выполнить эту работу? Поскольку я имею дело с маленькими наборами, это не должно быть супер оптимизировано. В настоящее время, мой подход является RANSAC-подобный алгоритм:

  1. Выберите 4 случайных точек из множества 1 и из множества 2.
  2. Compute преобразование матрицы H (с использованием OpenCV getPerspective())
  3. Деформация 1-й набор точек с помощью H и проверить, как они выровнены со вторым набором точек.
  4. Повторите 1-3 раза и выберите лучшее преобразование в соответствии с некоторой метрикой (например, суммой квадратов).

Любые идеи? Спасибо за ваш вклад.

ответ

0

Вы можете использовать только cv::findHomography. Это подход, основанный на RANSAC, около cv::getPerspectiveTransform.

auto H = cv::findHomography(srcPoints, dstPoints, CV_RANSAC,3); 

Где 3 пороговое значение для перепрограммирования.

+2

'резюме :: findHomography' требует, чтобы две точки множества (srcPoints и dstPoints здесь) соответствуют. Мне интересно узнать, как найти это соответствие, т. Е. Какие точки в облаке точки источника соответствуют тем точкам облака точки назначения. Подход RANSAC по-прежнему требует разумного количества ярусов. Простое прохождение двух нескоординированных точечных облаков не сработает. – lucab

+0

Я думал, что у вас уже есть спички, но вы хотите их разбить. однако, вам просто нужен алгоритм регистрации. Я попытаюсь вернуться позже –

+0

@HumamHelfawi Какой алгоритм регистрации вы предлагаете? (В моем случае у меня есть вращающийся и переведенный, несколько шумный набор, который я хочу сопоставить с предопределенным набором.) –

0

Один из традиционных подходов к решению вашей проблемы заключается в использовании метода регистрации точек, когда у вас нет соответствующей информации о парах. Регистрация набора точек аналогична методу, о котором вы говорите. Вы можете найти реализацию matlab here.

Благодаря

+0

Это действительно возможность. Благодарю. – lucab