Сопоставление 2D-набора точек

Как лучше всего сопоставить наборы точек сканирования (сделанных фотографий) с набором точек шаблона (синие, зеленые, красные, розовые круги на изображениях)? Я использую opencv/С++. Может быть, какой-то алгоритм ICP? Я хотел бы обернуть изображение сканирования в изображение шаблона!

набор точек шаблона: template image

набор точек сканирования: сканировать изображение


person Ben    schedule 08.12.2011    source источник


Ответы (4)


Если объект достаточно жесткий и выровненный, простой автокорреляция поможет. Если нет, я бы использовал RANSAC, чтобы оценить преобразование между субъектом и шаблоном (похоже, у вас есть характерные точки). Пожалуйста, предоставьте некоторые подробности о проблеме.

Редактировать: в вашем случае можно использовать RANSAC (консенсус случайной выборки). Думайте о ненужных точках в вашем шаблоне как о шуме (ложные функции, обнаруженные детектором функций) — они являются контурами. RANSAC может работать с планировщиками, потому что он выбирает небольшое подмножество характерных точек (минимальное количество, которое может инициировать вашу модель) случайным образом, инициирует модель и вычисляет, насколько хорошо ваша модель соответствует заданным данным (сколько других точек в шаблоне соответствует вашей модели). другие моменты). Если вы выберете неправильное подмножество, это значение будет низким, и вы потеряете модель. Если вы выберете правильное подмножество, оно будет высоким, и вы сможете улучшить свое совпадение с помощью алгоритма LMS.

person WebMonster    schedule 08.12.2011
comment
ну, я обнаруживаю прямоугольники как на шаблоне, так и на отсканированном изображении. теперь я хотел бы использовать краевые точки (синие, зеленые, красные круги) для переноса изображения... я не знаю никакого соответствия точек, которые вам нужны для findHomography (openCV)/RANSAC? - person Ben; 08.12.2011
comment
но мне все еще нужны пары точек для RANSAC? что-то, чтобы соответствовать пунктам скана и изображения шаблона? opencv.itseez.com/modules/calib3d/doc/ - person Ben; 08.12.2011

Вы должны соответствовать красным прямоугольникам? Исходное изображение содержит четыре черных прямоугольника по углам, которые кажутся созданными для сопоставления. Я могу надежно найти их с помощью 4 строк кода Mathematica:

lotto = [source image]
lottoBW = Image[Map[Max, ImageData[lotto], {2}]]

Для этого требуется max(R,G,B) для каждого пикселя, т.е. он отфильтровывает красную и желтую печать (более или менее). Результат выглядит следующим образом:

результат черно-белого фильтра

Затем я просто использую фильтр LoG, чтобы найти темные пятна и найти локальные максимумы в результирующем изображении.

lottoBWG = ImageAdjust[LaplacianGaussianFilter[lottoBW, 20]]
MaxDetect[lottoBWG, 0.5]

Результат: введите здесь описание изображения

person Niki    schedule 09.12.2011
comment
если вы посмотрите на мой другой шаблон, там не хватает одного черного прямоугольника: imageshack.us/f/ 27/thn.png imageshack.us/photo/my- images/683/hhn.png - person Ben; 09.12.2011

Вы смотрели пример OpenCV descriptor_extractor_matcher.cpp? ? В этом образце используется RANSAC для обнаружения гомографии между двумя входными изображениями. Я предполагаю, что когда вы говорите обертывание, вы на самом деле имеете в виду деформацию? Если вы хотите деформировать изображение с помощью обнаруженной вами матрицы гомографии, взгляните на warpPerspectiveфункция. Наконец, здесь есть несколько хороших руководств по использованию различных детекторов функций в OpenCV.

РЕДАКТИРОВАНИЕ: у вас может не быть функций SURF, но у вас определенно есть точки функций с разными классами. Сопоставление на основе признаков обычно делится на две фазы: обнаружение признаков (которое вы уже сделали) и извлечение, необходимое для сопоставления. Итак, вы можете попробовать преобразовать свои функции в KeyPoint, а затем выполнение извлечения признаков и сопоставления. Вот небольшой фрагмент кода того, как вы можете это сделать:

typedef int RED_TYPE = 1;
typedef int GREEN_TYPE = 2;
typedef int BLUE_TYPE = 3;
typedef int PURPLE_TYPE = 4;

struct BenFeature
{
    Point2f pt;
    int classId;
};

vector<BenFeature> benFeatures;

// Detect the features as you normally would in addition setting the class ID

vector<KeyPoint> keypoints;
for(int i = 0; i < benFeatures.size(); i++)
{
    BenFeature bf = benFeatures[i];
    KeyPoint kp(bf.pt,
                10.0, // feature neighborhood diameter (you'll probaby need to tune it)
                -1.0,  // (angle) -1 == not applicable
                500.0, // feature response strength (set to the same unless you have a metric describing strength)
                1, // octave level, (ditto as above)
                bf.classId // RED, GREEN, BLUE, or PURPLE.
                );
    keypoints.push_back(kp);
}

// now proceed with extraction and matching...

Возможно, вам потребуется настроить силу отклика таким образом, чтобы она не превышала пороговое значение на этапе извлечения. Но, надеюсь, это иллюстрирует то, что вы можете попытаться сделать.

person mevatron    schedule 09.12.2011
comment
Что, у меня нет очков характеристик? я только что получил координаты x, y своих точек, и я не думаю, что здесь работает что-то вроде серфинга / просеивания. Потому что, если вы посмотрите на мое исходное изображение шаблона, точки получили почти одинаковые окружающие области ... поэтому я не могу сопоставить их, используя метод brutfource или flann. но вы правы, я хотел бы использовать метод findHomography, warpPerspective OpenCV.. но как я могу найти пары точек между моим шаблоном и отсканированным изображением? - person Ben; 09.12.2011

Следуй этим шагам:

  1. Сопоставьте точки или функции на двух изображениях, это определит вашу упаковку;
  2. Определите, какое преобразование вы ищете для своей упаковки. Наиболее общим будет омография (см. cv::findHomography()), а менее общим будет простой перевод (используйте cv::matchTempalte()). Промежуточным случаем будет перемещение по x, y и вращение. Для этого я написал быструю функцию, которая лучше, чем гомография, поскольку она использует меньше степеней свободы, но при этом оптимизирует правильные метрики (квадрат разницы в координатах): https://stackoverflow.com/a/18091472/457687
  3. Если вы считаете, что в ваших совпадениях много выбросов, используйте RANSAC поверх шага 1. В основном вам нужно случайным образом выбрать минимальный набор точек, необходимых для поиска параметров, решить, определить выбросы, снова решить, используя все выбросы, а затем повторить попытку. чтобы улучшить ваше текущее решение (увеличить количество вставок, уменьшить ошибку или и то, и другое). Алгоритм RANSAC см. в Википедии: http://en.wikipedia.org/wiki/Ransac
person Vlad    schedule 07.08.2013