首页  >  文章  >  后端开发  >  如何使用透视变换和仿射变换对点进行倾斜校正?

如何使用透视变换和仿射变换对点进行倾斜校正?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-21 01:15:15342浏览

How to Deskew Points Using Perspective Transformation and Affine Transforms?

倾斜校正的透视变换

要使用透视变换对一组点实现倾斜校正效果,必须了解以下内容:

点排序:

点的顺序在透视变换中很重要。为了确保准确性,源向量和目标向量的顺序必须一致。

图像大小:

如果您希望生成的图像仅包含以下对象如果您感兴趣,请设置其宽度和高度以匹配生成的矩形的尺寸。

性能注意事项:

对于旋转、调整大小和倾斜校正等仿射变换,使用仿射变换效率更高对应:

  • getAffineTransform()
  • warpAffine()

仿射变换:

getAffineTransform()仅需要三个点并提供 2x3 矩阵,而warpAffine() 执行变形。

调整结果图像的大小:

要将结果图像的大小调整为与输入不同的大小,使用:

cv::Size size(box.boundingRect().width, box.boundingRect().height);
cv::warpPerspective(src, dst, size, ... );

示例:

vector<Point> not_a_rect_shape;
not_a_rect_shape.push_back(Point(408, 69));
not_a_rect_shape.push_back(Point(72, 2186));
not_a_rect_shape.push_back(Point(1584, 2426));
not_a_rect_shape.push_back(Point(1912, 291));

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

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

Point2f src_vertices[3];
src_vertices[0] = pts[0];
src_vertices[1] = pts[1];
src_vertices[2] = pts[3];

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

Mat warpAffineMatrix = getAffineTransform(src_vertices, dst_vertices);

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

以上是如何使用透视变换和仿射变换对点进行倾斜校正?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn