opencv - 查看仿射变换的结果

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

Update2:我有一幅图像,该图像的某个位置仅包含ROI(图像的其余部分为黑色),并且需要在其上应用一组仿射变换。为了简化操作并查看每个变换的效果,我将每个变换一个接一个地应用。我注意到的是,每当我移动(平移)图像使得ROI的中心位于坐标系的中心( View 窗口的左上角)时,所有仿射变换都不会移动而正确执行。但是,通过在坐标系统的中心平移ROI的中心,可以将ROI的上部和左侧保留在当前 View 窗口之外。
如果将ROI的中心点移到 View 窗口中的另一个点(例如窗口中心),则仿射变换类型为:
A = [a 0 0; 0 b 0](A是2x3矩阵,warpAffine函数的参数)
将图像(ROI)移动到 View 窗口之外(如果ROI的中心在左上角,则不会发生)。如何修改仿射变换,以使图像不会移出其位置(行为方式与ROI中心位于坐标系中心一样)?

最佳答案

如果您希望能够应用任何仿射变换,则将无法始终查看它。更好的主意是将变换手动应用于正方形的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]

进行矩阵乘法时,运算顺序从右向左读取。

https://stackoverflow.com/questions/13049800/

相关文章:

opencv - 分配像素值的安全方法

opencv - cvBlobsLib 查找重叠的 blob

c# - 将EMGUCV VectorOfKeyPoint保存到XML并再次加载

windows - OpenCV CVShow图像无法获得焦点

visual-c++ - OpenCv 和 Visual C++ Eyedetection

opencv - OpenCV中的对象跟踪

visual-studio-2008 - 带有cuda MS Visual Studio 2008的

opencv - SiftFeatureDetector()和Ptr

opencv - 如何找到检测到的圆的顺序?

android - OpenCV裁剪功能致命信号11