OLHWDB数据集 PTTS格式解析

本文详细介绍了如何读取和解析.ptts文件,这是一种用于存储手写笔迹数据的二进制格式。代码示例展示了如何逐个提取头信息、笔画数、采样点、行数、字符信息及标签代码。解析过程简单明了,适合理解手写数据的结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.数据格式

        其实.ptts文件就是个二进制文件,只要按照规则读就行了,难度不是很大。数据格式如下:

 二.主要代码

def read_ptts_from_dir(ptts_dir):
    with open(ptts_dir, 'rb') as f:
        header_size = struct.unpack('l', f.read(4))[0]
        #print(header_size)
        Format_code = f.read(8)
        #print(Format_code)
        Ill = f.read(header_size - 54)
        #print(Ill)
        code_type = f.read(20)
        #print(code_type)
        code_length = struct.unpack('h',f.read(2))[0]
        #print(code_length)
        data_type = f.read(20)
        #print(data_type)
        sample_length = struct.unpack('i', f.read(4))[0]
        #print(sample_length)
        page_index = struct.unpack('i',f.read(4))[0]
        #print(page_index)
        stroke_num = struct.unpack('i', f.read(4))[0]
        #print('笔画数:%d' %stroke_num)
        traj = []
        point_num = []
        for i in range(stroke_num):
            pointnum = struct.unpack('h', f.read(2))[0]
            point_num.append(pointnum)
            #print('采样点数:%d' %pointnum)
            #traj = []
            for j in range(pointnum):
                x = struct.unpack('H', f.read(2))[0]
                y = struct.unpack('H', f.read(2))[0]
                traj.append([x, y])
        #print(traj)
        line_num = struct.unpack('H', f.read(2))[0]
        #print('行数:%d' %line_num)
        tagcode = []
        char_stroke_index = []
        line_char_nmu_index = []
        char_stroke_num_index = []
        for i in range(line_num):
            line_stroke_nmu = struct.unpack('H', f.read(2))[0]
            #print('行笔画数:%d' %line_stroke_nmu)
            line_stroke_index = []
            for j in range(line_stroke_nmu):
                stroke_index = struct.unpack('H', f.read(2))[0]
                line_stroke_index.append(stroke_index)
            #print(line_stroke_index)
            line_char_nmu = struct.unpack('H', f.read(2))[0]
            line_char_nmu_index.append(line_char_nmu)
            #print('该行有:%d字符' %line_char_nmu)
            for char in range(line_char_nmu):
                tag_code = f.read(code_length)
                tag_code = tag_code.decode('gb18030')
                tag_code = tag_code.replace('\x00', '')
                tagcode.append(tag_code)
                char_stroke_num = struct.unpack('H', f.read(2))[0]
                char_stroke_num_index.append(char_stroke_num)
                #print('字符笔画数为:%d' %char_stroke_num)
                char_stroke_index_1 = []
                for index in range(char_stroke_num):
                    char_stroke_index_0 = struct.unpack('H', f.read(2))[0]
                    char_stroke_index_1.append(char_stroke_index_0)
                char_stroke_index.append(char_stroke_index_1)

        f.close()
    return stroke_num, point_num, traj, line_num, line_char_nmu_index, char_stroke_num_index, char_stroke_index, tagcode

 三.结果

①ground truth

 ②单字

③文本

 总结

        解析过程挺简单的,只要注意读取的顺序就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值