c++ - OpenCV 透视图

标签 c++ image image-processing opencv

由于某种原因,每当我使用 OpenCV 的 warpPerspective() 函数时,最终的变形图像不包含原始图像中的所有内容。图像的左侧部分似乎被切断了。我认为发生这种情况的原因是因为扭曲的图像是在 Canvas 的最左侧位置为 warpPerspective() 创建的。有没有办法解决这个问题?谢谢

最佳答案

出现问题是因为单应性将图像的一部分映射到图像区域之外的负 x,y 值,因此无法绘制。 我们希望做的是将扭曲的输出偏移一些像素,以将整个扭曲的图像“分流”到正坐标(因此在图像区域内)。

可以使用矩阵乘法来组合单应性(这就是它们如此强大的原因)。如果A和B是单应性,则AB表示先应用B,再应用A的单应性。

因此,我们需要做的就是偏移输出,为平移创建一些偏移量的单应矩阵,然后将其预乘以我们的原始单应矩阵

二维单应矩阵如下所示:

[R11,R12,T1]
[R21,R22,T2]
[ P , P , 1]

其中R代表旋转矩阵,T代表平移,P代表透视扭曲。 所以一个纯平移的单应性看起来像这样:

[ 1 , 0 , x_offset]
[ 0 , 1 , y_offset]
[ 0 , 0 ,    1    ]

因此,只需将您的单应性预乘以与上述类似的矩阵,您的输出图像就会发生偏移。

(确保使用矩阵乘法,而不是元素乘法!)

关于c++ - OpenCV 透视图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6087241/

相关文章:

linux - jpegtran 优化而不更改文件名

c++ - 使用 Clang 的 scan-build 和 scons 和 C++11

image - 没有x服务器的opencv显示图像

c++ - Main 方法与教程中的不同

css - 缩放图像保持纵横比,然后在流体高度和宽度 DIV 内垂直和水平居中

image - 如何在javafx imageView中获取显示图像的宽度/高度?

image - 查看.bin文件(YCbCr 4 :2:2 format)

image-processing - 为什么二进制描述符有效?

c++ - 在屏幕右侧显示主窗口(Qt 5.1.0)

c++ - 在 C++ 中创建文件夹