OpenCV 图片旋转的两个函数
- cv2.getRotationMatrix2D 获得仿射变化矩阵
- cv2.warpAffine 进行仿射变化
getRotationMatrix2D 获得仿射变化矩阵(warpAffine 方法的重要参数)
rot_mat = cv2.getRotationMatrix2D(center, -5, 1)
参数说明:
- center 表示中间点的位置,
- -5 表示逆时针旋转5度,
- 1 表示进行等比列的缩放
返回值:
rot_mat 仿射变化矩阵
例如:
warpAffine 进行仿射变化
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat, (img.shape[1], img.shape[0]))
参数说明:
- img 表示输入的图片,
- rot_mat 表示仿射变化矩阵,
- (image.shape[1], image.shape[0]) 表示变换后的图片大小,image.shape[1]表示宽,image.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]、[1]、[2]到底代表什么
img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数文章来源:https://www.toymoban.com/news/detail-453420.html
在矩阵中,[0]就表示行数,[1]则表示列数。文章来源地址https://www.toymoban.com/news/detail-453420.html
到了这里,关于OpenCV 图片旋转的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!