Opencv使用数据增强中斜矩形裁剪成正矩形的方法

先旋转大图再进行裁剪(推荐)

def rotate_bound(image, angle, center):
    '''
    image: 原始图像
    angle: 斜矩形的角度
    center: 斜矩形的中心坐标
    '''
   
    (h, w) = image.shape[:2]
    (cX, cY) = center
  
    M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
  
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))
  
    M[0, 2] += (nW / 2) - cX
    M[1, 2] += (nH / 2) - cY

    pts = np.float32(center).reshape([-1, 2])  
    pts = np.hstack([pts, np.ones([len(pts), 1])]).T
    target_point = np.dot(M, pts).astype(int)

    '''
    返回:
    1.斜矩形旋转后的中心坐标
    2.原始图像旋转后的新图像
    '''
  
    return tuple(target_point[:,0]), cv2.warpAffine(image, M, (nW, nH), borderValue=(255,255,255))
'''
im0: 原始包含斜矩形的图像
angle: 斜矩形框的弧度
(cx,cy): 斜矩形框的中心坐标
x: 斜矩形框的宽
y: 斜矩形框的高
'''
rect = ((cx,cy),(x,y),angle)
(n_cX, n_cY), whole_img = rotate_bound(im0.copy(), angle*180/math.pi, (cx,cy))
crop_img = whole_img.copy()[int(n_cY-y*0.7):int(n_cY+y*0.7), int(n_cX-x*0.7):int(n_cX+x*0.7)]
'''
(n_cX, n_cY): 斜矩形框旋转后的中心坐标
crop_img: 裁剪后的图像,正常是-0.5到0.5,可以设置0.7,调大斜矩形范围
'''

先裁剪目标小图,再进行旋转(会丢失部分信息,或者框的不准)

def rotate_bound(image, angle, center):
    '''
    image: 原始图像
    angle: 斜矩形的角度
    center: 斜矩形的中心坐标
    '''
   
    (h, w) = image.shape[:2]
    (cX, cY) = center
  
    M = cv2.getRotationMatrix2D((cX, cY), angle, 1.0)
    cos = np.abs(M[0, 0])
    sin = np.abs(M[0, 1])
  
    nW = int((h * sin) + (w * cos))
    nH = int((h * cos) + (w * sin))

    pts = np.float32(center).reshape([-1, 2])  
    pts = np.hstack([pts, np.ones([len(pts), 1])]).T
    target_point = np.dot(M, pts).astype(int)

    '''
    返回:
    1.斜矩形旋转后的中心坐标
    2.原始图像旋转后的新图像
    '''
  
    return tuple(target_point[:,0]), cv2.warpAffine(image, M, (nW, nH))
rect = ((cx,cy),(x,y),angle)
box = cv2.boxPoints(rect).astype(np.int)
x, y, w, h = cv2.boundingRect(box)  # 最大外接矩形(左上点坐标,宽与高)
cropImg = im0[int(y):int(y+h), int(x):int(x+w)]
_, cropImg = rotate_bound(cropImg.copy(), angle*180/math.pi, (int(w/2), int(h/2)))

最近更新

  1. TCP协议是安全的吗?

    2024-03-18 07:14:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-18 07:14:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-18 07:14:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-18 07:14:02       18 阅读

热门阅读

  1. 在 Nginx 中将 HTTP 重定向到 HTTPS

    2024-03-18 07:14:02       16 阅读
  2. 蓝桥杯刷题--python-22-dfs-bfs

    2024-03-18 07:14:02       19 阅读
  3. 条款13:用对象管理资源(智能指针)

    2024-03-18 07:14:02       18 阅读
  4. Excel数字签名技术总结

    2024-03-18 07:14:02       19 阅读
  5. 过多的 TIME_WAIT

    2024-03-18 07:14:02       16 阅读
  6. 第二十四章 Web Gateway 管理页面概述

    2024-03-18 07:14:02       16 阅读
  7. C语言如何进⾏字符数组的连接?

    2024-03-18 07:14:02       18 阅读
  8. Selenium笔记

    2024-03-18 07:14:02       19 阅读
  9. 使用TensorFlow 2.4进行深度学习

    2024-03-18 07:14:02       19 阅读
  10. 【C++】每日一题 219 存在重复元素

    2024-03-18 07:14:02       20 阅读