小智 32
之所以出现此问题是因为单应性将图像的一部分映射到图像区域外的负x,y值,因此无法绘制.我们希望做的是将扭曲的输出偏移一定数量的像素,以将整个变形图像"分流"成正坐标(因此在图像区域内).
可以使用矩阵乘法来组合Homographies(这就是为什么它们如此强大).如果A和B是单应性,那么AB代表首先应用B的单应性,然后是A.
因此,我们需要做的就是偏移输出是通过一些偏移为平移创建单应矩阵,然后通过我们原始的单应矩阵预乘
2D单应矩阵看起来像这样:
[R11,R12,T1]
[R21,R22,T2]
[ P , P , 1]
Run Code Online (Sandbox Code Playgroud)
其中R表示旋转矩阵,T表示平移,P表示透视扭曲.所以纯粹的翻译单应法看起来像这样:
[ 1 , 0 , x_offset]
[ 0 , 1 , y_offset]
[ 0 , 0 , 1 ]
Run Code Online (Sandbox Code Playgroud)
因此,只需通过类似于上面的矩阵预乘你的单应性,输出图像就会偏移.
(确保使用矩阵乘法,而不是元素乘法!)
马特的回答是一个好的开始,他说你需要将单应性乘以
[ 1 , 0 , x_offset]
[ 0 , 1 , y_offset]
[ 0 , 0 , 1 ]
Run Code Online (Sandbox Code Playgroud)
但他没有具体说明 x_offset 和 y_offset 是什么。其他答案说只需进行透视变换,但这是不正确的。您想要进行逆透视变换。
仅仅因为点 0,0 变换为 -10,-10,并不意味着将图像移动 10,10 将产生未裁剪的图像。这是因为点 10,10 不一定映射到 0,0。
您想要做的是找出哪个点将映射到 0,0,并将图像移动相应的量。为此,您需要单应性的逆(cv2.invert)并应用透视变换。
您需要应用逆变换来找到正确的点。
这将获得正确的 x_offset 和 y_offset 来对齐左上角点。从那里找到正确的边界框并完美地适应整个图像,您需要计算出倾斜(在正常、非逆、变换后图像向左或向上倾斜多少)并将该量添加到您的 x_offset 和 y_offset以及。
编辑:这都是理论。在我的测试中图像有几个像素的偏差,我不知道为什么。
warpPerspective() 工作正常。无需重写。您可能错误地使用了它。
请记住以下提示: