Намерете ъгли от перспектива на контур и деформация

Имам изображение като това:

Оригинално изображение

След това използвам някои техники, за да получа контурите на решетката на судоку. за демонстрация, ето снимка: (зелено=ограничаващо поле, червено=контур)

въведете описание на изображението тук

Сега въпросът ми; Как мога да изкривя това до идеален квадрат? Опитах се да използвам cvWarpPerspective, но изглежда не мога да разбера как да получа ъглите от контурите (червена линия).

Всяка помощ ще бъде високо оценена!


person Maarten Peels    schedule 24.06.2015    source източник
comment
Но ако не знаете къде са ъглите на червения четириъгълник, как да го нарисувате? Погледнахте ли тази връзка вече? Това трябва да свърши работа.   -  person LSA    schedule 24.06.2015
comment
Получавам и начертавам червената линия с този код, благодаря ще го проверя   -  person Maarten Peels    schedule 24.06.2015


Отговори (1)


ДОБРЕ. Имате контура на трапеца на пъзела. Имате ограничителната кутия. Искате добре изглеждащ квадрат. Това е субективна част от вашата система. Можете например просто да прикрепите целевата височина към ширината:

Rect target(0,0,boundbox.width,boundbox.width);

Как всъщност да трансформирате трапеца в квадрат?

Първо изрежете/задайте ROI на целта:

Mat cropped = source_image(target);

След това намирате homography matrix, като използвате изходния и целевия четириъгълник:

Point SourceTrapezoid[4]; // the trapezoid points, with boundbox.x and y subtracted
Point TargetSquare[4]; // 0,0, roi.width, roi.height
Mat homography_mat = findHomography(InputArray srcPoints, InputArray dstPoints)

Обърнете внимание, че точките в TargetSquare трябва да бъдат изброени в същия ред като в SourceTrapezoid (например, всички по посока на часовниковата стрелка).

След това просто приложете трансформацията:

Mat transformed;
perspectiveTransform(cropped, transformed, homography_mat);

И копирайте трансформираната кутия на нейното място:

transformed.copyTo(source_image(target));

Дадох ви пример с c++ opencv api, но c api е еквивалентен. Проверете документацията на opencv за еквиваленти на методите.

И както потребителят LSA добави в коментарите, в мрежата има много примери. Но стъпките за "трансформиране на четириъгълник в правоъгълник" са много прости:

  1. Решете съотношението и разположението на целевия правоъгълник (ако е приложимо)
  2. Подредете точките на целевия правоъгълник правилно като изходния четириъгълник
  3. Изчислете хомографията
  4. Приложете трансформацията на перспектива
  5. Поставете полученото изображение където искате (ако е приложимо)
person Boyko Perfanov    schedule 24.06.2015