import numpy as np
import cv2
# 仿射变换的两种方式:
# 1、利用变换前后的三个坐标点达到变换目的。
# 2、使用旋转角度和缩放倍数来变换。
# 可以用矩阵相乘或者向量叠加到矩阵表示的所有操作(旋转、平移(向量叠加)、缩放),这个就是类似于一个矩阵的变换。图像本身就是一个矩阵
img = cv2.imread(r'images/build.jpeg', 1)
rows, cols, channels = img.shape # h,w,c
# 第一部分:利用变换前的点和变换后的点求出仿射变换矩阵
p1 = np.float32([[0, 0], [cols - 1, 0], [0, rows - 1]]) # 原图像的点的集合
p2 = np.float32([[0, rows * 0.3], [cols * 0.45, rows * 0.25], [cols * 0.15, rows * 0.58]]) # 变换后的图像的点的集合
M = cv2.getAffineTransform(p1, p2) # 仿射变换矩阵
img_rotated_by_points = cv2.warpAffine(img, M, dsize=(cols, rows)) # M 就是仿射变换矩阵, dsize就是原始图像size
# 第二部分:利用旋转角度和缩放比例来求出仿射变换矩阵
center = (cols / 4, rows / 4) # 这个点就是未来的平移点
rot_mat = cv2.getRotationMatrix2D(center=center, angle=-35, scale=0.5) # 中心点,旋转角度,缩放比例
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat, (cols, rows))
res = np.hstack((img, img_rotated_by_points, img_rotated_by_alpha))
cv2.imshow('img', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果如下: