鉴于4分是
的结果QPolygon poly = transform.mapToPolygon(QRectF(0, 0, 1, 1));
如何找到QTransform transform
? (甚至更好:还有一个任意的源矩形)
动机:考虑到在透视扭曲的坐标系中绘制图像的四个角点,如何使用QPainter绘制图像?
这是一个屏幕截图,说明了GIMP中的问题,可以通过在图层的4个角周围移动来转换图层。这导致透视变换。我想在Qt应用程序中做同样的事情。我知道QTransform不仅限于仿射变换,还可以处理透视变换。
答案 0 :(得分:2)
您应该可以使用QTransform.squareToQuad
执行此操作。只需将要转换为的QPolygonF
传递给。
我有时会遇到一些问题让squareToQuad做我想做的事情,并且不得不使用QTransform.quadToQuad
来定义我自己的起始四边形,但你可能会有更多的运气。
答案 1 :(得分:1)
我想我找到了一个解决方案,它逐步计算转换矩阵。
// some example points:
QPointF p1(1.0, 2.0);
QPointF p2(2.0, 2.5);
QPointF p3(1.5, 4.0);
QPointF p4(3.0, 5.0);
// define the affine transformation which will position p1, p2, p3 correctly:
QTransform trans;
trans.translate(p1.x(), p1.y());
trans.scale(p2.x() - p1.x(), p3.y() - p1.y());
trans.shear((p3.x() - p1.x()) / trans.m11(), (p2.y() - p1.y()) / trans.m22());
到目前为止,trans描述了平行四边形变换。在这个paralellogram中,我在下一步找到了p4(相对)。我认为这可以使用不涉及反转的直接公式来完成。
// relative position of the 4th point in the transformed coordinate system:
qreal px = trans.inverted().map(p4).x();
qreal py = trans.inverted().map(p4).y();
// this defines the perspective distortion:
qreal y = 1 + (py - 1) / px;
qreal x = 1 + (px - 1) / py;
值x
和y
很难解释。仅给出其中一个(另一个设置为1
),这仅定义了p4
的相对缩放。但是x和y透视变换的组合,x和y的含义都很难;我通过反复试验找到了公式。
// and thus the perspective matrix:
QTransform persp(1/y, 0, 1/y-1,
0, 1/x, 1/x-1,
0, 0, 1);
// premultiply the perspective matrix to the affine transformation:
trans = persp * trans;
一些测试显示这导致了正确的结果。但是,我没有测试特殊情况,例如两点相等的情况,或者其中一个在两个点之间的线段上;我认为这种解决方案在这种情况下可能会破裂。
因此,我仍在搜索矩阵值m11
,m12
... m33
的一些直接公式,给定点坐标p1.x()
,{ {1}} ... p1.y()
,p4.x()
。