MSRA-TD500ラベルを反時計回りの出力ラベルに変換します+ labelemejson形式を4ポイントのtxtに変換します

1。MSRA-TD500: http ://www.iapr-tc11.org/mediawiki/index.php/MSRA_Text_Detection_500_Database_%28MSRA-TD500%29 

#coding:utf-8
"""
fzh created on 2019/12/6
将MSRA-TD500数据标签转换成按逆时针输出
也即 
index,difficulty label,x,y,w,h,0 -->>x1,y1,x2,y2,x3,y3,x4,y4
"""
import os
from math import *
import cv2
import numpy as np

def xy_rotate(angle,x,y,cx,cy):
    """
    点(x,y) 绕(cx,cy)点旋转
    """
    # angle = angle*pi/180#传入的已经是弧度了
    x_new = (x-cx)*cos(angle) - (y-cy)*sin(angle)+cx
    y_new = (x-cx)*sin(angle) + (y-cy)*cos(angle)+cy
    return x_new,y_new

def rec_rotate(x, y, width, height, theta):
    """
    传入矩形的x,y和宽度高度,弧度,转成QUAD格式
    :param x:
    :param y:
    :param width:
    :param height:
    :param theta:
    :return:
    """
    centerx = x + width / 2
    centery = y + height / 2

    x1, y1 = xy_rotate(theta, x, y, centerx, centery)
    x2, y2 = xy_rotate(theta, x + width, y, centerx, centery)
    x3, y3 = xy_rotate(theta, x, y + height, centerx, centery)
    x4, y4 = xy_rotate(theta, x + width, y + height, centerx, centery)

    return list(map(int,[x1, y1, x3, y3, x4, y4, x2, y2]))#逆时针输出
def make_standard_txt():
    """
    制作逆时针的polygon标签
    :return:
    """
    path = './test/'
    gt_lists_path = [os.path.join(path, i) for i in os.listdir(path) if '.gt' in i]
    for i, gt_list_path in enumerate(gt_lists_path):
        # if i < 1:
            print('gt_list_path:', gt_list_path)
            labels = []
            with open(gt_list_path, 'r', encoding='utf-8') as file:
                for read_info in file:
                    print('read_info:', read_info)
                    line = list(map(float, read_info.strip().split(' ')))
                    print('line:', line)
                    x, y = line[2], line[3]
                    w, h = line[4], line[5]
                    points = [x, y, x, y + h, x + w, y + h, x + w, y]
                    pointsrotate = rec_rotate(x, y, w, h, line[-1])
                    str_point = ','.join(map(str, pointsrotate)) + ',###'
                    print('str_point:', str_point)
                    labels.append(str_point)

            savename = gt_list_path[0:-2] + 'txt'
            print('savename:', savename)
            with open(savename, 'w', encoding='utf-8') as wfile:
                [wfile.write(label + '\n') for label in labels]
def read_val():
    """
    将make_standard_txt函数制作的polygon进行验证
    :return:
    """
    txt_path = './train/IMG_0723.txt'
    img_path = txt_path.replace('.txt', '.JPG')
    img = cv2.imread(img_path)
    print('img.shape:', img.shape)
    with open(txt_path, 'r', encoding='utf-8') as rfile:
        for j,read_info in enumerate(rfile):
            # if j<1:
                print('read_info:', read_info)
                point = list(map(int, read_info.strip().split(',')[:-1]))
                print('point:', point)
                #需要变成顺时针才用cv2.polylines显示
                point = [point[0], point[1], point[-2],point[-1], point[4], point[5], point[2], point[3]]
                cv2.polylines(img, [np.array(point).reshape(-1, 1, 2)], True, (0, 255, 0), thickness=5)
    cv2.imwrite('img.jpg', img)
if __name__ == '__main__':
    make_standard_txt()
    # read_val()

反時計回りに変換:

二。labeleme json形式を4ドット(時計回り)にtxt

import os
import json
import cv2
import numpy as np

#校正顺时针的四个点 从左上角开始
def cal_stand_points(points):
    rect = np.zeros((4, 2))
    s = np.sum(points, axis=1)
    rect[0] = points[np.argmin(s)]
    rect[2] = points[np.argmax(s)]
    # the top-right point will have the smallest difference,
    # whereas the bottom-left will have the largest difference
    d = np.diff(points, axis=1)
    rect[1] = points[np.argmin(d)]
    rect[3] = points[np.argmax(d)]
    return rect
def lableme_json_txt():
    path ='./效果差的_去章'

    imgs_list_path = [os.path.join(path, i) for i in os.listdir(path) if '.jpg' in i]
    print('==len(imgs_list_path)', len(imgs_list_path))
    for i, img_list_path in enumerate(imgs_list_path):
        # if i<1:
            json_list_path = img_list_path.replace('.jpg', '.json')
            output_txt_path = img_list_path.replace('.jpg', '.txt')
            with open(json_list_path, 'r') as file:
                json_info = json.load(file)
            print('===json_info', json_info)
            shapes = json_info['shapes']
            output_points = []
            for shape in shapes:
                points = np.array(shape['points']).astype(np.int)
                points = cal_stand_points(points)
                print('===points', points)
                output_points.append(list(map(str, (points.reshape(-1).tolist()))))
            print('===output_points', output_points)
            with open(output_txt_path, 'w', encoding='utf-8') as file:
                [file.write(','.join(out) + ',###\n') for out in output_points]

if __name__ == '__main__':
    lableme_json_txt()

おすすめ

転載: blog.csdn.net/fanzonghao/article/details/103424749