旋转一定角度的方法有两种
方法一:
M = cv2.getRotationMatrix2D((cx, cy), angle, 1)
(im_h, im_w) = image.shape[:2]
(cX, cY) = (im_w // 2, im_h // 2)
# img = np.array(img)
cos_ = np.abs(M[0, 0])
sin_ = np.abs(M[0, 1])
nW = int((im_h * sin_) + (im_w * cos_))
nH = int((im_h * cos_) + (im_w * sin_))
M[0, 2] += (nW / 2) - cX
M[1, 2] += (nH / 2) - cY
r_img = cv2.warpAffine(image, M, (nW, nH))
旋转后原图整个信息都在,为了保证旋转之后原图完整存留,需要重新计算旋转后的图片大小,原图之外会padding 0
方法二:
M = cv2.getRotationMatrix2D((cx, cy), angle, 1)
r_img = cv2.warpAffine(image, M, (image.shape[1], image.shape[0]))
旋转之后的图片保持原图大小,所以原图信息不会完整保存,意味着边缘部分将被截断
在目标检测训练过程中两种方法都可取,但为了不错过目标信息,我一般用第一种方法,但是在截图目标框的时候,方法一旋转之后,目标框对应位置也变了,但是方法二因为与原图保持大小一致,所以旋转之后的目标框可以直接裁取。
原图:
方法一旋转之后:
方法二旋转之后:
裁剪目标框: