OpenCV图像的变换

旋转变换

  • 旋转整个图像:若图像已知两点,连成一根直线,直线角度求得为angle,将其变换为水平线
    • 若将其视为一个向量,向量从左往右的情况
    • 需先求得旋转矩阵
    • 单位为度,不是弧度
    if direction is LEFT: ## vector direction start from the left pointint to the right
        m = cv2.getRotationMatrix2D((cx, cy), (-angle)/pi*180., 1.0) ## getRotationMatrix2D takes DEGREE not radian
        m_inv = cv2.getRotationMatrix2D((cx, cy), angle/pi*180., 1.0) ## the matrix rotate the image back
    else:
        m = cv2.getRotationMatrix2D((cx, cy), (pi-angle)/pi*180., 1.0)
        m_inv = cv2.getRotationMatrix2D((cx, cy), (angle-pi)/pi*180., 1.0)
     
    rotated = cv2.warpAffine(img, m, (w,h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
    rotate_back = cv2.warpAffine(rotated, m_inv, (w,h), flags=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
  • 旋转部分点:旋转后,以水平线为中心创建ROI,对ROI中图像进行处理,取出某几个特征点,通过已有旋转矩阵m_inv,将取出的特征点旋转回原图像 注意浮点数取整时选择的数据类型
roi = np.array([[cx-d//2, cy-d//2],\
                [cx+d//2, cy-d//2],\
                [cx+d//2, cy+d//2],\
                [cx-d//2, cy+d//2]])
roi_h = np.hstack([roi, np.ones((roi.shape[0], 1))])
corners = np.round(np.dot(m_inv, roi_h.T).T).astype(np.int64)