使用OpenCV和Python(正确)旋转图像(P2)
实现旋转功能,不会切断图像
首先,我要说的是,用于在OpenCV中旋转图像的 CV2.getRotationMatrix2D 和CV2.warpAffine 函数没有任何问题。
实际上,这些函数给了我们更多的自由度,这可能是我们无法接受的(有点像是比较手动内存管理和C语言,以及自动垃圾收集和Java语言)。
CV2.getRotationMatrix2D函数不关心是否要保留整个旋转图像。
它不在乎图像是否被切断。
如果你在使用这个功能时射中了自己的脚,这对你没有任何帮助(我是通过艰难的方式发现这一点的,用了3周时间才止血)。
相反,你需要做的是理解旋转矩阵是什么,以及它是如何构造的。
你看,当你用OpenCV旋转图像时,你称之为CV2.getRotationMatrix2D返回一个矩阵M,如下所示:

这个矩阵看起来很吓人,但我向你保证:不是。
为了理解它,让我们假设我们想要以一定的比例(即更小或更大)围绕某个中心(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线程和此线程。