rot_mat = cv2.getRotationMatrix2D(center, -5, 1)
参数说明:
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
参数说明:
返回值:
旋转后的图像
第一步:读入图片,进行图片展示
第二步:获取图片的宽、长、通道数,构造[0, 0, w, h]列表,然后用该列表实列化一个bbox对象(用于计算中心点)
第三步:计算其center值,将其代入到cv2.getRotationMatrix2D生成仿射变化矩阵
第四步:使用cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0])) 获得仿射变化以后的图像
第五步:如果计算源图像上的某点,位于转换后图像的位置。如果是源图片上的一个点,那么经过变化以后的坐标值为
(rot_mat[0][0] * x + rot_mat[0][1] * y + rot_mat[0][2], rot_mat[1][0] * x + rot_mat[1][1] * y + rot_mat[1][2]
第六步:进行旋转图片展示,为了保证,这里也可以进行截图操作
import cv2
import numpy as np
class BBox(object):
def __init__(self, bbox):
self.left = bbox[0]
self.top = bbox[1]
self.right = bbox[2]
self.bottom = bbox[3]
img = cv2.imread('0001.jpg')
cv2.imshow('img', img) # 显示图像
cv2.waitKey(0)
h, w, c = img.shape # 图像的高,宽,通道;注意:OpenCV 先获得高!然后是宽和通道。
box = [0, 0, w, h] # 创建一个列表,共4项,前两项表示原点,第三项为宽,第四项为高
bbox = BBox(box) # 创建BBox对象
center = ((bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2) # 计算中心点
rot_mat = cv2.getRotationMatrix2D(center, -5, 1) # 仿射变化矩阵
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
# rot_mat 仿射变化矩阵,warpAffine的重要参数
# img.shape[1]为图像宽度,img.shape[0]为图像高度 img为OpenCV变量
# 获得图片旋转以后的关键点的位置
# lanmark_ = np.asarray([(rot_mat[0][0] * x + rot_mat[0][1] * y + rot_mat[0][2],
# rot_mat[1][0] * x + rot_mat[1][1] + rot_mat[1][2]) for (x, y) in landmark])
cv2.imshow('img_rotated', img_rotated_by_alpha) # 显示旋转后的图像
cv2.waitKey(0)
# face = img_rotated_by_alpha[bbox.top:bbox.bottom + 1, bbox.left:bbox.right + 1]
#
# cv2.imshow('face', face)
# cv2.waitKey(0)
# 注意 该代码在Jupyter Notebook运行时有bug
img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数
在矩阵中,[0]就表示行数,[1]则表示列数。