Qt使用QTTransform组合两个图像

Qt使用QTTransform组合两个图像,qt,image-processing,linear-algebra,qimage,Qt,Image Processing,Linear Algebra,Qimage,我面临着一个可能很容易解决的问题,但我没有把它做好: 我有两个QImage,一个固定大小的背景图像imgBg,第二个QImageimgFg,应该使用仿射变换进行变换,然后在背景图像上绘制(并剪裁) 仿射变换如下所示: 围绕其原点缩放图像(均匀缩放) 围绕其原点旋转图像 将前景图像平移到背景图像上的某个参考位置,使前景的图像中心位于参考位置 以下是我迄今为止所做的工作: // Setup transform QTransform trans; trans.translate(-imgFg.wi

我面临着一个可能很容易解决的问题,但我没有把它做好: 我有两个QImage,一个固定大小的背景图像
imgBg
,第二个QImage
imgFg
,应该使用仿射变换进行变换,然后在背景图像上绘制(并剪裁)

仿射变换如下所示:

  • 围绕其原点缩放图像(均匀缩放)
  • 围绕其原点旋转图像
  • 将前景图像平移到背景图像上的某个参考位置,使前景的图像中心位于参考位置
以下是我迄今为止所做的工作:

// Setup transform
QTransform trans;
trans.translate(-imgFg.width()/2, -imgFg.height()/2); // move center of image to origin
trans.scale(scaleFac, scaleFac);
trans.rotate(angleDegrees);
trans.translate(imgFg.width()/2, imgFg.height()/2);

// Transform foreground image
imgFg = imgFg.transformed(trans);

// Paint on background image
QPointF referencePos(imgBg.width()/3, imgBg.height()/2); // some reference position
QPainter painter(&imgBg);
painter.drawImage(referencePos - QPointF(imgFg.width()/2, imgFg.height()/2), imgFg);
只要我只改变参考位置,一切正常。使用缩放和/或旋转时,图像也会正确缩放和旋转,但未放置在正确的位置(前景的图像中心与参考点不匹配)。
转换管道是否有问题?我犯了错误吗?

您需要颠倒对
q转换执行的语句顺序。顺序必须与直觉思维相反。这与线性代数中变换矩阵的矩阵乘法有关。(关于变换矩阵…)问题是变换应用于源坐标系,这有点不直观

因此,请记住:每当您想要应用多个变换时,请按照与图像相反的顺序进行变换

有关示例,请参见中的示例代码:

将文本缩放到半宽,然后顺时针旋转45度,然后将其原点移动到(50,50):

另一个问题是,您应该通过考虑缩放因子将图像转换回其原点(感谢Mat在问题注释中指出这一点)

应用于您的代码段(从下到上阅读以获得直观的操作顺序):

最后但并非最不重要的一点是,您希望将图像的中心作为新的原点(参考点),因此不应向后平移(现在是第一个操作;在代码中是最后一个操作)。然后在参考点绘制图像,而不是添加另一个大小/2。此外,不应将变换应用于图像,然后绘制此图像;至少这不是一种好的风格。只需将变换应用于画师,然后取消应用

QTransform trans;
trans.scale(scaleFac, scaleFac);
trans.rotate(angleDegrees);
trans.translate(imgFg.width()/2,imgFg.height()/2);

// Save old transform (only needed if you use other transformations)
const QTransform &oldTrans = painter.transform();
// Apply new transform
painter.setTransform(trans);
// Paint image at reference point
painter.drawImage(referencePoint, imgFg);
// Restore transform
painter.setTransform(oldTrans);

我想第二次翻译应该考虑比例因子。谢谢你的详细解释!通过缩放因子缩放最终平移,解决了该问题。
// Setup transform
QTransform trans;
trans.translate(imgFg.width()*scaleFac/2, imgFg.height()*scaleFac/2);
trans.rotate(angleDegrees);
trans.scale(scaleFac, scaleFac);
trans.translate(-imgFg.width()/2, -imgFg.height()/2);
QTransform trans;
trans.scale(scaleFac, scaleFac);
trans.rotate(angleDegrees);
trans.translate(imgFg.width()/2,imgFg.height()/2);

// Save old transform (only needed if you use other transformations)
const QTransform &oldTrans = painter.transform();
// Apply new transform
painter.setTransform(trans);
// Paint image at reference point
painter.drawImage(referencePoint, imgFg);
// Restore transform
painter.setTransform(oldTrans);