import numpy as npimport 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()
效果如下: