-
getRotationMatrix2D()
這個函數(shù)給定一個旋轉(zhuǎn)中心點的坐標(biāo)摸屠、旋轉(zhuǎn)角度和縮放因子,返回一個仿射變換矩陣 M缎除,不考慮縮放因子的話其形式大概如下:
逆時針旋轉(zhuǎn) 取正值,反之為負(fù)值乓诽。如果繞坐標(biāo)原點旋轉(zhuǎn)泉瞻,那么 莽囤,如果旋轉(zhuǎn)中心點不在原點,那么則要通過 的值對旋轉(zhuǎn)后的坐標(biāo)進(jìn)行調(diào)整房官。
紅色框是旋轉(zhuǎn)前的圖像 src_img趾徽,寬和高分別為 h 和 w,黑色框是逆時針旋轉(zhuǎn) 后的圖像 dst_img翰守「浇希可以看到,如果旋轉(zhuǎn)后圖像的寬和高保持不變潦俺,那么肯定會有一部分圖片會被裁掉拒课。而如果想要保證旋轉(zhuǎn)后圖片的所有像素都保留下來,那么新圖像就必須至少為淺藍(lán)色框這么大事示。易知早像,新圖像的寬和高至少為:
同時,由于我們是繞著原來圖像的中心點進(jìn)行旋轉(zhuǎn)的肖爵,而旋轉(zhuǎn)后圖像的中心點離原圖像中心點有偏移卢鹦,所以我們需要將旋轉(zhuǎn)后的坐標(biāo)調(diào)整到以旋轉(zhuǎn)后圖像的中心點為基準(zhǔn)。
import numpy as np
import cv2
img = cv2.imread(r'C:\Users\21058\Downloads\a.jpg')
img = cv2.resize(img, (512, 512))
h, w = img.shape[:2]
angle = 30
M = cv2.getRotationMatrix2D((w//2, h//2), angle, 1.0)
angle = angle / 180 * np.pi # 轉(zhuǎn)化為弧度制
h1 = int(w * np.sin(angle) + h * np.cos(angle))
w1 = int(w * np.cos(angle) + h * np.sin(angle))
M[0, 2] += (w1 - w) / 2
M[1, 2] += (h1 - h) / 2
rotate_img = cv2.warpAffine(img, M, (w1, h1))
cv2.imshow('img', img)
cv2.imshow('rotate_img', rotate_img)
cv2.waitKey(0)