0

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

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

4

1 回答 1

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]

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

于 2012-10-24T16:41:37.753 回答