上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在旋转期间裁剪图像