• 旋转矩形透视变换并裁剪


    # -*- coding: utf-8 -*-
    # ----------------------------
    # !  Copyright(C) 2022
    #   All right reserved.
    #   文件名称:xxx.py
    #   摘   要:xxx
    #   当前版本:1.0
    #   作   者:刘恩甫
    #   完成日期:2022-x-x
    # -----------------------------
    
    import json
    import os
    import cv2
    import numpy as np
    import math
    from math import fabs,sin,cos,radians,acos
    
    def rotate(img,pt1, pt2, pt3, pt4):
        withRect = math.sqrt((pt4[0] - pt1[0]) ** 2 + (pt4[1] - pt1[1]) ** 2)  # 矩形框的宽度
        heightRect = math.sqrt((pt1[0] - pt2[0]) ** 2 + (pt1[1] - pt2[1]) **2)
        angle = acos((pt4[0] - pt1[0]) / withRect) * (180 / math.pi)  # 矩形框旋转角度
    
        if pt4[1]>pt1[1]:
            pass
        else:
            angle=-angle
    
        height,width = img.shape[0], img.shape[1]
        rotateMat = cv2.getRotationMatrix2D((width / 2, height / 2), angle, 1)  # 按angle角度旋转图像
        heightNew = int(width * fabs(sin(radians(angle))) + height * fabs(cos(radians(angle))))
        widthNew = int(height * fabs(sin(radians(angle))) + width * fabs(cos(radians(angle))))
    
        rotateMat[0, 2] += (widthNew - width) / 2
        rotateMat[1, 2] += (heightNew - height) / 2
        imgRotation = cv2.warpAffine(img, rotateMat, (widthNew, heightNew), borderValue=(255, 255, 255))
    
        # 旋转后图像的四点坐标
        [[pt1[0]], [pt1[1]]] = np.dot(rotateMat, np.array([[pt1[0]], [pt1[1]], [1]]))
        [[pt3[0]], [pt3[1]]] = np.dot(rotateMat, np.array([[pt3[0]], [pt3[1]], [1]]))
        [[pt2[0]], [pt2[1]]] = np.dot(rotateMat, np.array([[pt2[0]], [pt2[1]], [1]]))
        [[pt4[0]], [pt4[1]]] = np.dot(rotateMat, np.array([[pt4[0]], [pt4[1]], [1]]))
    
        # 处理反转的情况
        if pt2[1]>pt4[1]:
            pt2[1],pt4[1]=pt4[1],pt2[1]
        if pt1[0]>pt3[0]:
            pt1[0],pt3[0]=pt3[0],pt1[0]
    
        imgOut = imgRotation[int(pt2[1]):int(pt4[1]), int(pt1[0]):int(pt3[0])]
    
        #做长宽比较
        crop_w,crop_h,crop_c=imgOut.shape
        if crop_w>crop_h:
            imgOut=np.rot90(imgOut,k=3)
    
        rotated_img=cv2.resize(imgRotation,dsize=None,fx=.25,fy=.25)
        crop_img=cv2.resize(imgOut,dsize=None,fx=.25,fy=.25)
        cv2.imshow('rotated img',rotated_img)
        cv2.imshow("cropped img",crop_img)  # 裁减得到的旋转矩形框
        return imgRotation
    
    if __name__ == '__main__':
        base_path=r'D:\liu_projects\package_maskrcnn_20220628\truck_warp_affine\\'
        for path in os.listdir(base_path):
            name,ext=os.path.splitext(path)
            if ext=='.json':
                img=cv2.imread(base_path+name+'.jpg')
    
                json_data=json.load(open(base_path + name+'.json', 'r', encoding='utf-8'))
                for j in range(len(json_data['shapes'])):
                    label = json_data['shapes'][j]['label']
                    point_array = np.array(json_data['shapes'][j]['points']).astype(np.int)
    
                    rotatedRect = cv2.minAreaRect(point_array)  # 计算最小外接矩形
                    box = cv2.boxPoints(rotatedRect)  #计算矩形的坐标
                    box = np.int0(box)
    
                    img_copy=img.copy()
                    #画轮廓
                    for k in range(len(point_array)-1):
                        cv2.line(img_copy, (point_array[k][0], point_array[k][1]), (point_array[k + 1][0], point_array[k + 1][1]), (0,0,255), 5)
                    #画最小外接矩形
                    for k in range(len(box)-1):
                        cv2.line(img_copy,(box[k][0],box[k][1]),(box[k+1][0],box[k+1][1]),(255,0,0),5)
                    cv2.line(img_copy,(box[-1][0],box[-1][1]),(box[0][0],box[0][1]),(255,0,0),5)
    
                    imgRotation=rotate(img, box[0], box[1], box[2], box[3])
    
                resized_img=cv2.resize(img_copy,dsize=None,fx=.25,fy=.25)
                cv2.imshow('resized_img',resized_img)
                cv2.waitKey(0)
  • 相关阅读:
    High availability: Oracle RAC vs. RAC One Node vs. Data Guard
    ORACLE 12C RAC修改ocr/votedisk/asm spfile所在磁盘组名称
    Oracle性能排查小案例
    Oracle技术支持是如何分析数据库性能问题的
    【翻译】19C Oracle 安装指导
    Install Grid Infrastructure 12c On Standalone Server
    Linux平台oracle 11g单实例 + ASM存储 安装部署
    HOW TO USE ORACLE RESTART IN ORACLE 11GR2
    单机安装Oracle RAC (zt)
    flink on yarn启动失败
  • 原文地址:https://www.cnblogs.com/liutianrui1/p/16427534.html
Copyright © 2020-2023  润新知