欢迎光临散文网 会员登陆 & 注册

使用OpenCV和Python(正确)旋转图像(P2)

2022-02-08 18:11 作者:闲予1217  | 我要投稿

实现旋转功能,不会切断图像

首先,我要说的是,用于在OpenCV中旋转图像的 CV2.getRotationMatrix2DCV2.warpAffine 函数没有任何问题。

实际上,这些函数给了我们更多的自由度,这可能是我们无法接受的(有点像是比较手动内存管理和C语言,以及自动垃圾收集和Java语言)。

CV2.getRotationMatrix2D函数不关心是否要保留整个旋转图像。

它不在乎图像是否被切断。

如果你在使用这个功能时射中了自己的脚,这对你没有任何帮助(我是通过艰难的方式发现这一点的,用了3周时间才止血)。

相反,你需要做的是理解旋转矩阵是什么,以及它是如何构造的。

你看,当你用OpenCV旋转图像时,你称之为CV2.getRotationMatrix2D返回一个矩阵M,如下所示:

CV2返回的矩阵M的结构。getRotationMatrix2D。

这个矩阵看起来很吓人,但我向你保证:不是。

为了理解它,让我们假设我们想要以一定的比例(即更小或更大)围绕某个中心(c_{x},c_{y})坐标旋转图像0度。

然后我们可以插入\alpha和\beta的值:

\α=标度*cos\theta和β=标度*sin\theta

对于简单的旋转来说,这一切都很好,但它没有考虑到如果图像沿着边界被切掉会发生什么。我们如何补救?

答案就在rotate_-bound函数中。imutils的py:

(这里的第几行就看上面的代码是第几行)

在第1行,我们定义了rotate_界函数。

此方法接受输入图像和旋转角度。

我们假设我们将围绕图像的中心(x,y)坐标旋转图像,所以我们在第4行和第5行确定这些值。

根据这些坐标,我们可以称之为CV2。获取旋转矩阵x2d以获得旋转矩阵M(第8行)。

然而,为了调整任何图像边界截断问题,我们需要应用一些我们自己的手动计算。

我们首先从旋转矩阵M(第9行和第10行)中获取余弦和正弦值。

这使我们能够计算旋转图像的新宽度和高度,确保图像的任何部分都不会被切断。

一旦我们知道了新的宽度和高度,我们就可以通过再次修改旋转矩阵来调整第17行和第18行的平移。

最后是CV2。在第21行调用warpAffine,使用OpenCV旋转实际图像,同时确保没有任何图像被切断。

对于使用OpenCV时旋转切断问题的其他一些有趣的解决方案(一些比其他更好),请务必参考此StackOverflow线程和此线程。


使用OpenCV和Python(正确)旋转图像(P2)的评论 (共 条)

分享到微博请遵守国家法律