OpenCV 图片旋转

OpenCV 图片旋转的两个函数

  1. cv2.getRotationMatrix2D 获得仿射变化矩阵
  2. 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

OpenCV 图片旋转_第1张图片
原始图像
OpenCV 图片旋转_第2张图片
旋转后图像

关于img.shape[0]、[1]、[2]到底代表什么

img.shape[0]:图像的垂直尺寸(高度)
img.shape[1]:图像的水平尺寸(宽度)
img.shape[2]:图像的通道数

在矩阵中,[0]就表示行数,[1]则表示列数。

你可能感兴趣的:(Python,opencv,计算机视觉,python)