ДОБРЕ. Имате контура на трапеца на пъзела. Имате ограничителната кутия. Искате добре изглеждащ квадрат. Това е субективна част от вашата система. Можете например просто да прикрепите целевата височина към ширината:
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 добави в коментарите, в мрежата има много примери. Но стъпките за "трансформиране на четириъгълник в правоъгълник" са много прости:
- Решете съотношението и разположението на целевия правоъгълник (ако е приложимо)
- Подредете точките на целевия правоъгълник правилно като изходния четириъгълник
- Изчислете хомографията
- Приложете трансформацията на перспектива
- Поставете полученото изображение където искате (ако е приложимо)
person
Boyko Perfanov
schedule
24.06.2015