【发布时间】:2013-12-01 20:12:43
【问题描述】:
我想为图像的选定部分创建一个仿射变换工具(4 个角多边形,请参见图像链接)。 http://s14.postimg.org/fn9btus8h/explanation.png
我尝试使用 opencv 但没有成功。
感谢您的帮助。 问候
【问题讨论】:
标签: opencv image-processing affinetransform
我想为图像的选定部分创建一个仿射变换工具(4 个角多边形,请参见图像链接)。 http://s14.postimg.org/fn9btus8h/explanation.png
我尝试使用 opencv 但没有成功。
感谢您的帮助。 问候
【问题讨论】:
标签: opencv image-processing affinetransform
您应该向我们展示您的尝试,以及您如何没有成功。 您可能使用错误的点来创建转换矩阵。 正确的步骤如下所述。
您应该使用getAffineTransform 创建仿射变换矩阵。如documentation 中所述,这会将输入三角形映射到输出三角形。但是你应该确保你通过了两个平面的三个对应点。
如果您不确定如何选择两个平面的三个对应点,只需使用getPerspectiveTransform 并按各自的顺序传入两个平面的四个点。它仍然有效,因为仿射变换只是透视变换的一个特例。
得到变换矩阵后,应使用warpAffine或warpPerspective进行映射
输入图像。
【讨论】:
感谢大家的帮助。我找到了解决方案。
我使用了 Qt 功能。这是我的代码:
QImage img;
img.load("D:\\sample.png");
QPolygonF polygonIn;
polygonIn << QPointF(29, 25)
<< QPointF(147, 9)
<< QPointF(210, 100)
<< QPointF(0, 84);
QPolygonF polygonOut;
polygonOut << QPointF(29, 25)
<< QPointF(147, 25)
<< QPointF(210, 132)
<< QPointF(0, 84);
QTransform transform;
auto isOk = QTransform::quadToQuad(polygonIn, polygonOut, transform);
if(!isOk)
throw std::runtime_error("Transformation impossible with such parameters.");
img = img.transformed(transform.toAffine(), Qt::TransformationMode::SmoothTransformation);
【讨论】: