Как получить трансформацию перспективы для кривого (нарисованного вручную) прямоугольника?
Это то, что я хочу:
Но вместо этого я получил:
Вот мой код:
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);
Постскриптум Все прямоугольники, с которыми я работал, нарисованы от руки. Может быть, это работает только для прямых прямоугольников?
Вы используете аффинные преобразования для перспективы проблема. Аффинное преобразование моделирует только вращение, перемещение и масштабирование (как вертикальное, так и горизонтальное), поэтому ваша проблема не может быть решена с помощью этого вида преобразования. Вместо этого используйте перспективное преобразование.
РЕДАКТИРОВАТЬ: Эй, посмотри на этот хороший учебник с помощью cv::getPerspectiveTransform
а также cv::WarpPerspective
также используя 4 угла, как в вашем сценарии. Это может решить вашу проблему!