查看仿射变换的结果

时间:2012-10-24 13:03:16

标签: opencv affinetransform

我试图找出为什么当我在OpenCV中对图像应用仿射变换时,其结果在预览窗口中不可见,但整个窗口是黑色的。如何找到此问题的解决方法这样我总能在窗口中查看我的变换图像(仿射变换的结果),无论应用的变换是什么? 更新:我认为这是因为所有变换都是根据坐标系的原点(图像的左上角)计算出来的。对于旋转我可以指定旋转的中心,并且我能够查看结果,当我执行缩放时,我无法控制变换图像的去向。有可能以某种方式移动坐标系以使图像适合窗口吗?

Update2:我的图像只包含其中某个位置的ROI(图像的其余部分为黑色),我需要在其上应用一组仿射变换。为了使事情更简单并且看到每个变换的效果,我逐个应用了每个变换。我注意到的是,每当我移动(平移)图像使得ROI的中心位于坐标系的中心(视图窗口的左上角)时,所有仿射变换都能正确执行而不会移动。但是,通过在坐标系的中心平移ROI的中心,ROI的上部和左部保持从当前视图窗口切出。 如果我将ROI的中心点移动到视图窗口中的另一个点(例如窗口中心),则类型为仿射变换: A = [a 0 0; 0 b 0](A是2x3矩阵,warpAffine函数的参数) 移动图像(ROI),在视图窗口之外(如果ROI的中心位于左上角,则不会发生)。如何修改仿射变换,使图像不会移动到位(行为与ROI中心位于坐标系中心的行为相同)?

1 个答案:

答案 0 :(得分:2)

如果您希望能够应用任何仿射变换,您将无法始终查看它。更好的想法可能是手动将变换应用到正方形的4个角,然后查看这4个点最终的坐标。这将告诉你图像的去向。

如果您有多个变换,只需将它们组合成一个变换即可。如果你有3个变换

[A],[B],[C]

通过A转换图像,然后转换为B,然后C相当于通过

转换图像一次
[C]*[B]*[A]

如果你的变换是2x3矩阵,只需添加

将它们转换为3x3矩阵
[0,0,1]

作为新的底行,然后将3x3矩阵相乘,当你完成后,底行将保持不变,然后只需将其删除即可获得新的,组合的仿射变换

<强>更新 如果要将变换应​​用于对象,就好像该对象位于其他位置。您可以组合3个变换。首先使用仿射变换[A]将对象转换为您想要转换的位置(在您的情况下坐标系的中心)。然后应用缩放变换[B],然后转换回您开始的位置。翻译应该是[A]的倒数。这意味着你的最终转型将是

final_transform = [A].inv()*[B]*[A]

在进行矩阵乘法时,操作顺序从右向左读取。

相关问题