Получить перспективное преобразование для кривого прямоугольника

Как получить трансформацию перспективы для кривого (нарисованного вручную) прямоугольника?

Это то, что я хочу:

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

Но вместо этого я получил:

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

Вот мой код:

Rect boundingBox(boundingRect(countours[largest_contour_index]));

vector<Point> not_a_rect_shape;
not_a_rect_shape.push_back(boundingBox.tl());
not_a_rect_shape.push_back(Point(boundingBox.tl().x, boundingBox.br().y));
not_a_rect_shape.push_back(boundingBox.br());
not_a_rect_shape.push_back(Point(boundingBox.br().x, boundingBox.tl().y));

RotatedRect box = minAreaRect(cv::Mat(not_a_rect_shape));

Point2f pts[4];
box.points(pts);

cv::Point2f src_vertices[4];
src_vertices[0] = not_a_rect_shape[0];
src_vertices[1] = not_a_rect_shape[1];
src_vertices[2] = not_a_rect_shape[3];
src_vertices[3] = not_a_rect_shape[2];

Point2f dst_vertices[4];
dst_vertices[0] = Point(0, 0);
dst_vertices[1] = Point(box.boundingRect().width-1, 0);
dst_vertices[2] = Point(0, box.boundingRect().height-1);
dst_vertices[3] = Point(box.boundingRect().width-1, box.boundingRect().height-1);

Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

cv::Mat rotated;
cv::Size size(box.boundingRect().width, box.boundingRect().height);
warpAffine(src, rotated, warpAffineMatrix, size, INTER_LINEAR, BORDER_CONSTANT);

imshow("rotated.jpg", rotated);

Постскриптум Все прямоугольники, с которыми я работал, нарисованы от руки. Может быть, это работает только для прямых прямоугольников?

0

Решение

Вы используете аффинные преобразования для перспективы проблема. Аффинное преобразование моделирует только вращение, перемещение и масштабирование (как вертикальное, так и горизонтальное), поэтому ваша проблема не может быть решена с помощью этого вида преобразования. Вместо этого используйте перспективное преобразование.

РЕДАКТИРОВАТЬ: Эй, посмотри на этот хороший учебник с помощью cv::getPerspectiveTransform а также cv::WarpPerspectiveтакже используя 4 угла, как в вашем сценарии. Это может решить вашу проблему!

0

Другие решения


По вопросам рекламы [email protected]