1、函数介绍:
cv2.getRotationMatrix2D()
这个函数需要三个参数,旋转中心,旋转角度,旋转后图像的缩放比例
原点旋转:
任意位置旋转:
2、cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
其中:
src - 输入图像。
M - 变换矩阵。
dsize - 输出图像的大小。
flags - 插值方法的组合(int 类型!)
borderMode - 边界像素模式(int 类型!)
borderValue - (重点!)边界填充值; 默认情况下,它为0。
flages表示插值方式,默认为 flags=cv2.INTER_LINEAR,表示线性插值此外还有:cv2.INTER_NEAREST(最近邻插值) cv2.INTER_AREA(区域插值) cv2.INTER_CUBIC(三次样条插值)cv2.INTER_LANCZOS4(Lanczos插值)
实例:
import cv2
import matplotlib.pyplot as plt
img = cv2.imread('IOU.jpg')
rows,cols = img.shape[:2]
#第一个参数旋转中心,第二个参数旋转角度,第三个参数:缩放比例
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,1)
#第三个参数:变换后的图像大小
res = cv2.warpAffine(img,M,(rows,cols))
plt.subplot(121)
plt.imshow(img)
plt.subplot(122)
plt.imshow(res)
更多旋转相关请参考:OpenCV-Python:图像的几何变换(平移、旋转、仿射变换等)( http://blog.topspeedsnail.com/archives/2124 )
3、函数rotate:
import tensorflow as tf
import numpy as np
import cv2
def rotate(img, bbox, landmark, alpha):
"""
given a face with bbox and landmark, rotate with alpha
and return rotated face with bbox, landmark (absolute position)
"""
#对于给定的bbox和landmark,旋转alpha角度,同时返回旋转后的图片和landmark的绝对坐标
center = ((bbox[0]+bbox[2])/2, (bbox[1]+bbox[3])/2) #中心坐标
rot_mat = cv2.getRotationMatrix2D(center, alpha, 1) #逆时针旋转,缩放因子是1
print("rot_mat:%s"%rot_mat)
#whole image rotate
#pay attention: 3rd param(col*row)
img_rotated_by_alpha = cv2.warpAffine(img, rot_mat,(img.shape[1],img.shape[0]))
landmark_ = 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]*y+rot_mat[1][2]) for (x, y) in landmark])
#crop face
face = img_rotated_by_alpha[bbox[1]:bbox[3]+1,bbox[0]:bbox[2]+1]
cv2.imshow("img_rotated_by_alpha", img_rotated_by_alpha)
print("landmark_:%s" % landmark_)
return (face, landmark_)
img = cv2.imread("IOU.jpg",1)
bbox = np.array([5,5,75,75]) # x1(横坐标),y1(纵坐标),x2,y2
landmark = np.array([[10,10],[50,10],[35,20],[10,50],[50,50]])
img = cv2.resize(img,(300,250))
cv2.circle(img,(10,10),2,(0,0,255),-1)
cv2.circle(img,(50,10),2,(0,0,255),-1)
cv2.circle(img,(35,20),2,(0,0,255),-1)
cv2.circle(img,(10,50),2,(0,0,255),-1)
cv2.circle(img,(50,50),2,(0,0,255),-1)
cv2.rectangle(img,(bbox[0],bbox[1]),(bbox[2],bbox[3]),(0,255,0), 2)
rotate(img, bbox, landmark, 5)
cv2.imshow("img",img)
cv2.waitKey()
作用:用来做数据增强使用。