由于某种原因,每当我使用 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/