上一篇记录了HIT-OR3C联机数据的解析代码,由于OLHWDB不同于HIT-OR3C,其在采集联机手写体数据时就没有按照固定size去采集(HIT-OR3C保存的坐标是转换后相对128*128大小画布的相对坐标),而是一个绝对坐标(解析的第一个sample的y就有6000多,以为搞错了就扔一边了)

这周重新打开仔细研究了下官方POTView的C++源码,终于是把CASIA的OLHWDB数据解析出来了!


由于OLHWDB记录的是sample各个笔画的采样点,所以并没有记录sample的长宽,需要自己去初始化一个画布,然后把采样点描回去,所以借鉴了POTView的trajDisp的思路写了个Python版的解析代码(修改了一个点是计算xmin, ymin, xmax, ymax部分,按照源码的逻辑出现了bug)

Python版解析完整代码:

import os
import os.path as osp
import numpy as np
import cv2
from PIL import Image
import struct
from tqdm import tqdm
import pickledataset_name = 'OLHWDB1.0'
root = osp.join('/Users/wangnu/Documents/dataset/CASIA/', dataset_name)
train_dir = osp.join(root, dataset_name+'trn_pot')
test_dir = osp.join(root, dataset_name+'tst_pot')
train_dataset = os.listdir(train_dir)
test_dataset = os.listdir(test_dir)def drawStroke(img, pts, xmin, ymin, x_shift, y_shift):pt_length = len(pts)stroke_start_tag = Falsefor i in range(1, pt_length):if pts[i][0] == -1 and pts[i][1] == 0:stroke_start_tag = Truecontinueif stroke_start_tag:stroke_start_tag = Falsecontinuex_delta, y_delta = -xmin+x_shift, -ymin+y_shiftcv2.line(img, (pts[i-1][0]+x_delta, pts[i-1][1]+y_delta), (pts[i][0]+x_delta, pts[i][1]+y_delta), color=(0, 0, 0), thickness=5)return imgdef read_from_pot_dir(pot_dir):def one_file(f):while True:# 文件头,交代了该sample所占的字节数以及label以及笔画数header = np.fromfile(f, dtype='uint8', count=8)if not header.size: breaksample_size = header[0] +(header[1]<<8)tagcode = header[2] + (header[3]<<8) + (header[4]<<16) + (header[5]<<24)stroke_num = header[6] + (header[7]<<8)# 以下是参考官方POTView的C++源码View部分的Python解析代码traj = []xmin, ymin, xmax, ymax = 100000, 100000, 0, 0for i in range(stroke_num):while True:header = np.fromfile(f, dtype='int16', count=2)x, y = header[0], header[1]traj.append([x, y])if x == -1 and y == 0:breakelse:# 个人理解此处的作用是找到描述该字符的采样点的xmin,ymin,xmax,ymax# 但此处若采用源码的逻辑if x < xmin: xmin = x, else if x > xmax: xmax = x会出现了bug# 如果points中x或y是递减的,由于不会执行else判断,会导致xmax或ymax始终为0if x < xmin: xmin = xif x > xmax: xmax = xif y < ymin: ymin = yif y > ymax: ymax = y# 最后还一个标志文件结尾的(-1, -1)header = np.fromfile(f, dtype='int16', count=2)# 根据得到的采样点重构出样本x_shift, y_shift = 5, 5 # 画线是有thickness的,所以上下左右多padding几格canva = np.ones((ymax-ymin+2*y_shift, xmax-xmin+2*x_shift), dtype=np.uint8)*255pts = np.array(traj)img = drawStroke(canva, pts, xmin, ymin, x_shift, y_shift)yield img, tagcodefor file_name in os.listdir(pot_dir):if file_name.endswith('.pot'):file_path = os.path.join(pot_dir, file_name)with open(file_path, 'rb') as f:for img, tagcode in one_file(f):yield img, tagcode# 解析字母表
char_set = set()
for _, tagcode in tqdm(read_from_pot_dir(pot_dir=test_dir)):tagcode_unicode = struct.pack('>H', tagcode).decode('gb2312')char_set.add(tagcode_unicode)
char_list = list(char_set)
char_dict = dict(zip(sorted(char_list), range(len(char_list))))
alphabet_length = len(char_dict)alphabet_path = osp.join(root, 'alphabet_'+str(alphabet_length))
with open(alphabet_path, 'wb') as f:pickle.dump(char_dict, f)print('alphabet length: ', alphabet_length)# 输出到文件夹
train_counter = 0
test_counter = 0train_parse_dir = osp.join(root, dataset_name+'trn/')
if not os.path.exists(train_parse_dir):os.mkdir(train_parse_dir)
test_parse_dir = osp.join(root, dataset_name+'tst/')
if not os.path.exists(test_parse_dir):os.mkdir(test_parse_dir)for image, tagcode in tqdm(read_from_pot_dir(pot_dir=train_dir)):tagcode_unicode = struct.pack('>H', tagcode).decode('gb2312')im = Image.fromarray(image)dir_name = train_parse_dir + '%0.5d'%char_dict[tagcode_unicode]if not os.path.exists(dir_name):os.mkdir(dir_name)im.convert('RGB').save(dir_name+'/' + str(train_counter) + '.png')train_counter += 1for image, tagcode in tqdm(read_from_pot_dir(pot_dir=test_dir)):tagcode_unicode = struct.pack('>H', tagcode).decode('gb2312')im = Image.fromarray(image)dir_name = test_parse_dir + '%0.5d'%char_dict[tagcode_unicode]if not os.path.exists(dir_name):os.mkdir(dir_name)im.convert('RGB').save(dir_name+'/' + str(test_counter) + '.png')test_counter += 1

【OCR炼丹】解析CASIA数据集OLHWDB部分Python版完整代码相关推荐

  1. 用faster-rcnn训练自己的数据集(VOC2007格式,python版)

    用faster-rcnn训练自己的数据集(VOC2007格式,python版) 一. 配置caffe环境 ubunt16.04下caffe环境安装 二. 下载,编译及测试py-faster-rcnn源 ...

  2. python版FlappyBird代码解析

        Flappy Bird是前段时间(好像一年or两年前....)特别火的有一个小游戏,相信大家都玩过.     Flappy Bird操作简单,通过点击手机屏幕使Bird上升,穿过柱状障碍物之后 ...

  3. 基于WiFi的CSI数据做呼吸频率检测-python版(含代码和数据)

    一.概述 本Demo无需机器学习模型,Demo功能涉及的理论主要参考了硕士学位论文<基于WiFi的人体行为感知技术研究>,作者是南京邮电大学的朱XX,本人用python复现了论文中呼吸频率 ...

  4. python画图完整代码-Python科学画图代码分享

    Python画图主要用到matplotlib这个库.Matplotlib 是一个 Python 的 2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形. 具体来说是pylab和p ...

  5. Spearman 相关性分析法,以及python的完整代码应用

    Spearman 相关性分析法 简介 Spearman 相关性分析法是一种针对两个变量之间非线性关系的相关性计算方法,同时,它不对数据的分布进行假设.该方法的基本思想是将两个(也可以多个)变量的值进行 ...

  6. python爬虫完整代码下载页

    由于上一个连接有些网址被和谐,所以这里贴出完整的代码 运行是修改path路径为你自己保存图片的位置. # -*- coding: utf-8 -*- # 作者: 废人一枚 # 出自: 北京 # 创建时 ...

  7. 国密算法 SM4 对称加密 分组密码 python实现完整代码

    目前,python实现的国密算法库主要是python-gmssl库和snowland-smx(pysmx)库,二者都对SM2(仅公钥加解密和数字签名).SM3.SM4进行了细致而优雅的实现. GMSS ...

  8. Python爬虫完整代码拿走不谢

    对于新手做Python爬虫来说是有点难处的,前期练习的时候可以直接套用模板,这样省时省力还很方便. 使用Python爬取某网站的相关数据,并保存到同目录下Excel. 直接上代码: import re ...

  9. python 石头剪刀布,Python石头剪刀布完整代码

    print("游戏介绍:\n" "数字1代表石头\n" "数字2代表剪刀\n" "数字3代表布") 游戏次数 playn ...

最新文章

  1. python生成订单号或生成任意序列
  2. userinits.exe, wupcltr.exe的分析及解决办法
  3. Android的AlertDialog详解
  4. MySQL5.6 选项和变量整理
  5. H - Holy Grail
  6. python cx_oracle配置_python连接oracle的模块cx_Oracle安装和配置
  7. 你准备好了吗,江湖来了
  8. 7 win 卸载node_如何从windows中完全删除node.js_windows彻底卸载node教程
  9. Oracle的重做日志
  10. IE css HACK
  11. 算法4第6章后缀数组讲解
  12. Python(10)--文件读写/模块制作与发布
  13. Hydration failed because the initial UI does not match what was rendered on the server.问题原因之一
  14. 浅析2022年6月六级翻译真题
  15. 学会Pr剪辑培训,兼职竟比主业还高?
  16. 网盘搜索神器php源码,127网盘搜索源码|网盘资源搜索神器|thinkphp3.1.3框架开发的...
  17. 贪心算法-加勒比海盗船——最优装载问题
  18. 一个老的游戏,据说全世界只有不到4000人可以走出房间.密室逃脱--之“天蓝色房间”...
  19. Hibernate注解详解(超全面)
  20. TI DSP TMS320C66x学习笔记之VLIB测试数据(三)

热门文章

  1. U盘出现RAW问题时的数据恢复
  2. 免费的sql工具_免费SQL工具
  3. 天空之门手游怎么用电脑玩 天空之门手游模拟器教程
  4. 鸿蒙系统图片大全,江南百景图鸿蒙版
  5. Mac的Dock栏是什么?Mac Dock栏使用技巧
  6. 用CDN的小伙伴注意了 小心阿里云注销你的备案
  7. libnet发包java语言_libnet 安装问题
  8. 论在Xamarin里对AbsoluteLayout动态添加按钮控件实例(1)
  9. 基于网页可信特征的信息可信度评估方法(IEEE2011)
  10. 二进制文件与16进制(十六进制)文本文件互转工具