Съпоставяне на 2D точки

Кой е най-добрият начин за съпоставяне на наборите точки от сканиране (направена снимка) към набора точки на шаблона (сини, зелени, червени, розови кръгове в изображенията)? Използвам opencv/c++. Може би някакъв вид ICP алгоритъм? Бих искал да обвия сканираното изображение в изображението на шаблона!

набор от шаблонни точки: шаблонно изображение

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


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

Разглеждали ли сте пробата descriptor_extractor_matcher.cpp на OpenCV ? Тази проба използва RANSAC за откриване на хомографията между двете входни изображения. Предполагам, че когато казвате обвиване, всъщност имате предвид изкривяване? Ако искате да изкривите изображението с хомографската матрица, която откриете, погледнете warpP перспектива функция. И накрая, ето няколко добри урока, използващи различните детектори на функции в 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 methode. но сте прав, бих искал да използвам метода findHomography, warpPerspective на OpenCV.. но как мога да намеря двойки точки между моя шаблон и сканирано изображение? - person Ben; 09.12.2011

Следвай тези стъпки:

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