智能硬件与机器视觉:基于树莓派、Python和OpenCV
上QQ阅读APP看书,第一时间看更新

4.2.5 旋转图像

下面,我们对图像进行旋转操作:


 # 使用OpenCV将图像旋转45度, #47
# 首先计算图像中心, #48
# 然后构造旋转矩阵,最后执行扭曲   #49
center = (w // 2, h // 2)   #50
M = cv2.getRotationMatrix2D(center, -45, 1.0)   #51
rotated = cv2.warpAffine(image, M, (w, h))  #52
cv2.imshow("OpenCV Rotation", rotated)  #53
cv2.waitKey(0)  #54

围绕中心点旋转图像,首先需要计算图像的中心坐标(x,y)(第50行)。

注意

使用//来进行整数运算(也就是没有浮点值)。

需要计算一个旋转矩阵M(第51行)。–45意味着顺时针旋转图像45度。

用第52行的矩阵来扭曲(或者叫旋转)图像。用第53行的命令旋转图像并显示在屏幕上,如图4-6所示。

图4-6 使用OpenCV围绕中心点旋转图像

如图4-6所示,使用OpenCV围绕中心点旋转图像需要3个步骤:

1)使用图像宽度和高度计算中心点;

2)计算旋转矩阵cv2.getRotationMatrix2D;

3)使用旋转矩阵cv2.warpAffine旋转图像。

现在,使用imutils在一行代码中实现相同的操作:


 # 通过使用较少代码的imutils也可以轻松完成旋转 #56
rotated = imutils.rotate(image, -45)    #57
cv2.imshow("Imutils Rotation", rotated) #58
cv2.waitKey(0)  #59

仅需要一行代码,就可以实现将图像顺时针旋转45度(第57行),如图4-7所示。

此时我们会发现一个问题,为什么图像被裁剪了?

出现问题的地方在于,OpenCV并不关心图像在旋转后是否被裁剪,是否在视野范围内。所以可以使用rotate_bound,使整个图像保持在视野范围内:


 # 如果旋转图像在旋转后被裁剪,    #61
# OpenCV并不“管”,  #62
# 所以可以使用另一个imutils函数来解决 #63
rotated = imutils.rotate_bound(image, 45)   #64
cv2.imshow("Imutils Bound Rotation", rotated)   #65
cv2.waitKey(0)  #66

图4-7 使用imutils.rotate,可以使用一行代码方便地用OpenCV和Python旋转图像

结果如图4-8所示,整个图像位于帧中,并顺时针旋转了45度。

图4-8 使用rotate_bound函数阻止OpenCV在旋转期间裁剪图像