精华内容
下载资源
问答
  • unity 手写功能手写板基于UGUI实现,可定制大小和位置,可保存为透明png 图片,可一键清除 有效果详情展示https://blog.csdn.net/u013509878/article/details/111259967
  • 原标题:中文简历表格提取,手写汉字识别(Python+OpenCV)所有代码获取:简历网上对表格框的提取的相关资料较少,尤其是Python+OpenCV的实现方面。整体流程 如今OpenCV官方的Document里都包含了各API的Python版用法,...

    原标题:中文简历表格提取,手写汉字识别(Python+OpenCV)

    所有代码获取:

    简历

    网上对表格框的提取的相关资料较少,尤其是Python+OpenCV的实现方面。

    整体流程

    b43dd25796ab48fc94107c8d99f08671.jpeg

    如今OpenCV官方的Document里都包含了各API的Python版用法,从C++转换到Python用起来意外的顺手。这里附上官方的在线Document地址,记得选对应版本:https://docs.opencv.org/

    该部分的编译环境如下:

    (1)Ubuntu16.04 64位 支持utf-8编码

    (2)Python2.7

    (3)OpenCV3.4.3 (与Python2.7编译通)

    (4)Python2.7 numpy模块、PIL模块、logging模块、pickle模块、os模块、random模块、time模块、matplotlib模块、math模块、csv模块

    读取表格图片文件

    fce2214762d1443ab38838812b3ac0bf.png

    这段即将test_data文件中的所有文件进行遍历读取,也可注释最下方的两行,并去除docu_num一行的注释,即可对一张图片文件进行反复的读取、处理。

    统计图中长横线的斜率来判断整体需要旋转矫正的角度

    1a89a8df1f6b43b0a2f6e7d91d07c205.jpeg

    这段做的是旋转校正操作,先把表格图片转换为灰度图,再用Canny算子提取边缘(灰度+Canny是提取边缘的标准操作)得到如下这张图片edges_whole.jpg

    ddd1177e5bfb4a7682bab64d3d878dba.jpeg

    085059f4f8a541c5b89a719d4869f090.jpeg

    之后便是用getRotationMatrix2D、warpAffine函数进行旋转变换,此处笔者拷贝了一份不进行绘图操作的图片(不然都涂花了,干嘛为难自己)。旋转后的表格图片如下image_Rotation.jpg:

    b57ea4d72ee744529f7176214f7ebf27.jpeg

    通过对表格左下角直角进行识别,将其顶点统一平移矫正至(78,1581)

    370d78f596b74e2792768202dc65eb4a.jpeg

    这段做的是平移校正操作,其中大部分是为了应对数据集中的各种意外情况,譬如表格形式不同。但对于Github中给出的三幅较为统一的图片,核心的操作只有对旋转校正后的表格左下角进行横线、竖线用HoughLinesP进行提取,归一后求二者的交点。将交点平移至设定好的坐标即可统筹处理所有表格图片。此处对霍夫变换求出的各条直线分别与设定好两个等分点进行距离求解,选出最靠近等分点的横线、竖线作为归一结果。求得交点坐标后用np.array函数与cv.warpAffine函数即可完成平移操作。

    横线、竖线的交点求得后在旋转后的表格图像上作图如下line_detect_possible_demo.jpg:

    4e760934cc3146f5a6413432502d6876.jpeg

    分别通过对二值化后的表格用长横条、长竖条内核进行开操作,将表格分别化为全横线与全竖线,叠加后提取交点,即可得到表格中每个矩形的四个顶点

    e959d8ca3b46449f8c8fd4b0a1642635.jpeg

    此段是功能实现的核心操作:通过对校正图像进行横向、纵向的投影,并提取直线、直线交点,提取轮廓后通过所需表格框的尺寸数据对交点进行筛选、匹配,即可得到表格中的各个框四个顶点的坐标。此处理对表格中的小框效果拔群,对大型框进行提取可能遇到一框中有多个小框的情况,需要后续加以限制(统计该框内是否有别的顶点)。具体操作是:

    对未涂花的原始图像进行灰度变化和自适应阈值的二值化操作adaptiveThreshold,这样能最大可能地保留表格中的直线,效果如下图th2.jpg:

    9690877898834a9f9fc507185e60f24a.jpeg

    之后对图像进行先腐蚀erode后膨胀dilate的闭操作,腐蚀与膨胀分别使用N*1与1*N的形态学操作中的核进行处理。该操作可以理解为把表格中所有的像素进行横向、纵向的投影,且投影会往原先已存在直线上偏移,而文字状的不构成直线的像素则会在腐蚀操作中被抹消。就像从长条形的横、纵栅格中看表格图片一般。将横向、纵向投影好的图片进行叠加即如下图mask.jpg:

    7422d8672b4148369abc12d42d2dd07f.jpeg

    表格被神奇地提取出来了!这一步需要注意,一定要是旋转校正过的图像,因为对于一张倾斜的图像,投影操作会让图像变“正”了,实际上图像并没有被旋转过来,这对后续的坐标提取是致命的。既然已经提取出了表格框,那我们就可以通过bitwise_and函数提取出表格框中的各个交点,如下图joints.jpg:

    ffddb2959aa3447d8930a68cebe5c175.jpeg

    接下来即通过findContours函数寻找图像轮廓,并用contourArea函数求出各个轮廓的面积,以对过小的轮廓进行排除。通过approxPolyDP与boundingRect函数用矩形去包围各个轮廓,即可得到该表格图片中各个矩形框的位置数据。之后通过再次使用findContours函数遍历图像轮廓,用尺寸数据对矩形框进行筛选即可得到表格中所需的框的集合。在校正图像上画出这个集合里的所有框,如下图table_out.jpg:

    9cca3c683b3549388ca1c4cfa21c2e94.jpeg

    矫正后的表格中信息的大致位置各在一定范围内,根据大致位置的坐标点筛选出该表中该信息对应的矩形框具体坐标

    63c1d4fb383d4172af00718b1c7dcff2.jpeg

    既然框都已经被提取出来了,那不是大功告成了吗?

    并没有。因为我们还需要对所需要的位置的框进行提取,先前提取出的框又不附带标签。因此我们此处需要做两步:

    首先是选择标准图像中所需的框位置的中心点作为这个框的“ID”,标准图像即先前所说的坐标(78,1581)所在的那张图片。上文代码里即选择(700,370)作为“性别”数据的所在框的大致位置。

    其次是通过遍历的方式筛选出这个中心点坐标所处在的矩形框的坐标。因为框较大,因此即使校正的不够精准,这种方法一样可以将目标框精准地框出,只要标准图像中的那个大致位置不偏移得太过严重。返回搜狐,查看更多

    责任编辑:

    展开全文
  • 结合实例,介绍采用ePH1200、电阻式触摸屏和微控制器(MSP430)实现汉字手写输入的硬件接口电路与软件编程方法。关键词手写体辨识触摸屏ePH1200辨识芯片 许多的掌上装置与移动设备采用小型嵌入式系统,而这些装置很...
  • 问题导读:1、相比于简单...不如来尝试一下类别多大3000+的汉字手写识别吧!!虽然以前有一些文章教大家如何操作,但是大多比较古老,这篇文章将用全新的TensorFlow 2.0 来教大家如何搭建一个中文OCR系统!让我...

    问题导读:

    1、相比于简单minist识别,汉字识别具有哪些难点?

    2、如何快速的构建一个OCR网络模型?

    3、读取的时候有哪些点需要注意?

    4、如何让模型更简单的收敛?

    thread-27378-1-1.html

    还在玩minist?fashionmnist?不如来尝试一下类别多大3000+的汉字手写识别吧!!虽然以前有一些文章教大家如何操作,但是大多比较古老,这篇文章将用全新的TensorFlow 2.0 来教大家如何搭建一个中文OCR系统!

    让我们来看一下,相比于简单minist识别,汉字识别具有哪些难点:

    搜索空间空前巨大,我们使用的数据集1.0版本汉字就多大3755个,如果加上1.1版本一起,总共汉字可以分为多达7599+个类别!这比10个阿拉伯字母识别难度大很多!数据集处理挑战更大,相比于mnist和fasionmnist来说,汉字手写字体识别数据集非常少,而且仅有的数据集数据预处理难度非常大,非常不直观,但是,千万别吓到,相信你看完本教程一定会收货满满!汉字识别更考验选手的建模能力,还在分类花?分类猫和狗?随便搭建的几层在搜索空间巨大的汉字手写识别里根本不work!你现在是不是想用很深的网络跃跃欲试?更深的网络在这个任务上可能根本不可行!!看完本教程我们就可以一探究竟!总之一句话,模型太简单和太复杂都不好,甚至会发散!(想亲身体验模型训练发散抓狂的可以来尝试一下!)。

    但是,挑战这个任务也有很多好处:

    本教程基于TensorFlow2.0,从数据预处理,图片转Tensor以及Tensor的一系列骚操作都包含在内!做完本任务相信你会对TensorFlow2.0 API有一个很深刻的认识!如果你是新手,通过这个教程你完全可以深入体会一下调参(或者说随意修改网络)的纠结性和蛋疼性!

    本项目实现了基于CNN的中文手写字识别,并且采用标准的tensorflow 2.0 api 来构建!相比对简单的字母手写识别,本项目更能体现模型设计的精巧性和数据增强的熟练操作性,并且最终设计出来的模型可以直接应用于工业场合,比如 票据识别, 手写文本自动扫描 等,相比于百度api接口或者QQ接口等,具有可优化性、免费性、本地性等优点。

    数据准备

    在开始之前,先介绍一下本项目所采用的数据信息。我们的数据全部来自于CASIA的开源中文手写字数据集,该数据集分为两部分:

    CASIA-HWDB:离线的HWDB,我们仅仅使用1.0-1.2,这是单字的数据集,2.0-2.2是整张文本的数据集,我们暂时不用,单字里面包含了约7185个汉字以及171个英文字母、数字、标点符号等;CASIA-OLHWDB:在线的HWDB,格式一样,包含了约7185个汉字以及171个英文字母、数字、标点符号等,我们不用。

    其实你下载1.0的train和test差不多已经够了,可以直接运行 dataset/get_hwdb_1.0_1.1.sh 下载。原始数据下载链接点击这里.由于原始数据过于复杂,我们使用一个类来封装数据读取过程,这是我们展示的效果:

    none.gif

    2019-06-25_155558.jpg (167.8 KB, 下载次数: 6)

    2019-6-25 15:56 上传

    看到这么密密麻麻的文字相信连人类都.... 开始头疼了,这些复杂的文字能够通过一个神经网络来识别出来??答案是肯定的.... 不有得感叹一下神经网络的强大。。上面的部分文字识别出来的结果是这样的:

    none.gif

    2019-06-25_155631.jpg (121.23 KB, 下载次数: 8)

    2019-6-25 15:57 上传

    关于数据的处理部分,从服务器下载到的原始数据是 trn_gnt.zip 解压之后是 gnt.alz, 需要再次解压得到一个包含 gnt文件的文件夹。里面每一个gnt文件都包含了若干个汉字及其标注。直接处理比较麻烦,也不方便抽取出图片再进行操作,虽然转为图片存入文件夹比较直观,但是不适合批量读取和训练, 后面我们统一转为tfrecord进行训练。

    更新:实际上,由于单个汉字图片其实很小,差不多也就最大80x80的大小,这个大小不适合转成图片保存到本地,因此我们将hwdb原始的二进制保存为tfrecord。同时也方便后面训练,可以直接从tfrecord读取图片进行训练。

    none.gif

    2019-06-25_155705.jpg (197.68 KB, 下载次数: 5)

    2019-6-25 15:57 上传

    在我们存储完成的时候大概处理了89万个汉字,总共汉字的空间是3755个汉字。由于我们暂时仅仅使用了1.0,所以还有大概3000个汉字没有加入进来,但是处理是一样。使用本仓库来生成你的tfrecord步骤如下:

    cd dataset && python3 convert_to_tfrecord.py, 请注意我们使用的是tf2.0;你需要修改对应的路径,等待生成完成,大概有89万个example,如果1.0和1.1都用,那估计得double。

    模型构建

    关于我们采用的OCR模型的构建,我们构建了3个模型分别做测试,三个模型的复杂度逐渐的复杂,网络层数逐渐深入。但是到最后发现,最复杂的那个模型竟然不收敛。这个其中一个稍微简单模型的训练过程:

    none.gif

    2019-06-25_155744.jpg (91.18 KB, 下载次数: 12)

    2019-6-25 15:58 上传

    大家可以看到,准确率可以在短时间内达到87%非常不错,测试集的准确率大概在40%,由于测试集中的样本在训练集中完全没有出现,相对训练集的准确率来讲偏低。可能原因无外乎两个,一个事模型泛化性能不强,另外一个原因是训练还不够。

    不过好在这个简单的模型也能达到训练集90%的准确率,it's a good start. 让我们来看一下如何快速的构建一个OCR网络模型:

    [mw_shl_code=python,true]def build_net_003(input_shape, n_classes):

    model = tf.keras.Sequential([

    layers.Conv2D(input_shape=input_shape, filters=32, kernel_size=(3, 3), strides=(1, 1),

    padding='same', activation='relu'),

    layers.MaxPool2D(pool_size=(2, 2), padding='same'),

    layers.Conv2D(filters=64, kernel_size=(3, 3), padding='same'),

    layers.MaxPool2D(pool_size=(2, 2), padding='same'),

    layers.Flatten(),

    layers.Dense(n_classes, activation='softmax')

    ])

    return model[/mw_shl_code]

    这是我们使用keras API构建的一个模型,它足够简单,仅仅包含两个卷积层以及两个maxpool层。下面我们让大家知道,即便是再简单的模型,有时候也能发挥出巨大的用处,对于某些特定的问题可能比更深的网络更有用途。关于这部分模型构建大家只要知道这么几点:

    如果你只是构建序列模型,没有太fancy的跳跃链接,你可以直接用keras.Sequential 来构建你的模型;

    Conv2D中最好指定每个参数的名字,不要省略,否则别人不知道你的写的事输入的通道数还是filters。

    最后,在你看完本篇博客后,并准备自己动手复现这个教程的时候, 可以思考一下为什么下面这个模型就发散了呢?(仅仅稍微复杂一点):

    [mw_shl_code=python,true]​

    def build_net_002(input_shape, n_classes):

    model = tf.keras.Sequential([

    layers.Conv2D(input_shape=input_shape, filters=64, kernel_size=(3, 3), strides=(1, 1),

    padding='same', activation='relu'),

    layers.MaxPool2D(pool_size=(2, 2), padding='same'),

    layers.Conv2D(filters=128, kernel_size=(3, 3), padding='same'),

    layers.MaxPool2D(pool_size=(2, 2), padding='same'),

    layers.Conv2D(filters=256, kernel_size=(3, 3), padding='same'),

    layers.MaxPool2D(pool_size=(2, 2), padding='same'),

    layers.Flatten(),

    layers.Dense(1024, activation='relu'),

    layers.Dense(n_classes, activation='softmax')

    ])

    return model[/mw_shl_code]

    数据输入

    其实最复杂的还是数据准备过程啊。这里着重说一下,我们的数据存入tfrecords中的事image和label,也就是这么一个example:

    [mw_shl_code=python,true]example = tf.train.Example(features=tf.train.Features(

    feature={

    "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),

    'image': tf.train.Feature(bytes_list=tf.train.BytesList(value=[img.tobytes()])),

    'width': tf.train.Feature(int64_list=tf.train.Int64List(value=[w])),

    'height': tf.train.Feature(int64_list=tf.train.Int64List(value=[h])),

    }))[/mw_shl_code]

    然后读取的时候相应的读取即可,这里告诉大家几点坑爹的地方:

    将numpyarray的bytes存入tfrecord跟将文件的bytes直接存入tfrecord解码的方式事不同的,由于我们的图片数据不是来自于本地文件,所以我们使用了一个tobytes()方法存入的事numpy array的bytes格式,它实际上并不包含维度信息,所以这就是坑爹的地方之一,如果你不同时存储width和height,你后面读取的时候便无法知道维度,存储tfrecord顺便存储图片长宽事一个好的习惯.

    关于不同的存储方式解码的方法有坑爹的地方,比如这里我们存储numpy array的bytes,通常情况下,你很难知道如何解码。。(不看本教程应该很多人不知道)

    最后load tfrecord也就比较直观了:

    [mw_shl_code=python,true]def parse_example(record):

    features = tf.io.parse_single_example(record,

    features={

    'label':

    tf.io.FixedLenFeature([], tf.int64),

    'image':

    tf.io.FixedLenFeature([], tf.string),

    })

    img = tf.io.decode_raw(features['image'], out_type=tf.uint8)

    img = tf.cast(tf.reshape(img, (64, 64)), dtype=tf.float32)

    label = tf.cast(features['label'], tf.int64)

    return {'image': img, 'label': label}

    def parse_example_v2(record):

    """

    latest version format

    :param record:

    :return:

    """

    features = tf.io.parse_single_example(record,

    features={

    'width':

    tf.io.FixedLenFeature([], tf.int64),

    'height':

    tf.io.FixedLenFeature([], tf.int64),

    'label':

    tf.io.FixedLenFeature([], tf.int64),

    'image':

    tf.io.FixedLenFeature([], tf.string),

    })

    img = tf.io.decode_raw(features['image'], out_type=tf.uint8)

    # we can not reshape since it stores with original size

    w = features['width']

    h = features['height']

    img = tf.cast(tf.reshape(img, (w, h)), dtype=tf.float32)

    label = tf.cast(features['label'], tf.int64)

    return {'image': img, 'label': label}

    def load_ds():

    input_files = ['dataset/HWDB1.1trn_gnt.tfrecord']

    ds = tf.data.TFRecordDataset(input_files)

    ds = ds.map(parse_example)

    return ds[/mw_shl_code]

    这个v2的版本就是兼容了新的存入长宽的方式,因为我第一次生成的时候就没有保存。。。最后入坑了。注意这行代码:

    [mw_shl_code=python,true] img = tf.io.decode_raw(features['image'], out_type=tf.uint8)[/mw_shl_code]

    它是对raw bytes进行解码,这个解码跟从文件读取bytes存入tfrecord的有着本质的不同。同时注意type的变化,这里以unit8的方式解码,因为我们存储进去的就是uint8.

    训练过程

    不瞒你说,我一开始写了一个很复杂的模型,训练了大概一个晚上结果准确率0.00012, 发散了。后面改成了更简单的模型才收敛。整个过程的训练pipleline:

    [mw_shl_code=python,true]def train():

    all_characters = load_characters()

    num_classes = len(all_characters)

    logging.info('all characters: {}'.format(num_classes))

    train_dataset = load_ds()

    train_dataset = train_dataset.shuffle(100).map(preprocess).batch(32).repeat()

    val_ds = load_val_ds()

    val_ds = val_ds.shuffle(100).map(preprocess).batch(32).repeat()

    for data in train_dataset.take(2):

    print(data)

    # init model

    model = build_net_003((64, 64, 1), num_classes)

    model.summary()

    logging.info('model loaded.')

    start_epoch = 0

    latest_ckpt = tf.train.latest_checkpoint(os.path.dirname(ckpt_path))

    if latest_ckpt:

    start_epoch = int(latest_ckpt.split('-')[1].split('.')[0])

    model.load_weights(latest_ckpt)

    logging.info('model resumed from: {}, start at epoch: {}'.format(latest_ckpt, start_epoch))

    else:

    logging.info('passing resume since weights not there. training from scratch')

    if use_keras_fit:

    model.compile(

    optimizer=tf.keras.optimizers.Adam(),

    loss=tf.keras.losses.SparseCategoricalCrossentropy(),

    metrics=['accuracy'])

    callbacks = [

    tf.keras.callbacks.ModelCheckpoint(ckpt_path,

    save_weights_only=True,

    verbose=1,

    period=500)

    ]

    try:

    model.fit(

    train_dataset,

    validation_data=val_ds,

    validation_steps=1000,

    epochs=15000,

    steps_per_epoch=1024,

    callbacks=callbacks)

    except KeyboardInterrupt:

    model.save_weights(ckpt_path.format(epoch=0))

    logging.info('keras model saved.')

    model.save_weights(ckpt_path.format(epoch=0))

    model.save(os.path.join(os.path.dirname(ckpt_path), 'cn_ocr.h5'))[/mw_shl_code]

    在本系列教程开篇之际,我们就立下了几条准则,其中一条就是handle everything, 从这里就能看出,它事一个很稳健的训练代码,同事也很自动化:

    自动寻找之前保存的最新模型;自动保存模型;捕捉ctrl + c事件保存模型。支持断点续训练

    大家在以后编写训练代码的时候其实可以保持这个好的习惯。

    OK,整个模型训练起来之后,可以在短时间内达到95%的准确率:

    none.gif

    2019-06-25_155959.jpg (62.43 KB, 下载次数: 11)

    2019-6-25 16:00 上传

    效果还是很不错的!

    模型测试

    最后模型训练完了,时候测试一下模型效果到底咋样。我们使用了一些简单的文字来测试:

    none.gif

    2019-06-25_160034.jpg (106.42 KB, 下载次数: 4)

    2019-6-25 16:01 上传

    这个字写的还真的。。。。具有鬼神之势。相信普通人类大部分字都能认出来,不过有些字还真的。。。。不好认。看看神经网络的表现怎么样!

    none.gif

    2019-06-25_160104.jpg (131.27 KB, 下载次数: 4)

    2019-6-25 16:01 上传

    这是大概2000次训练的结果, 基本上能识别出来了!神经网络的认字能力还不错的! 收工!

    总结

    通过本教程,我们完成了使用tensorflow 2.0全新的API搭建一个中文汉字手写识别系统。模型基本能够实现我们想要的功能。要知道,这个模型可是在搜索空间多大3755的类别当中准确的找到最相似的类别!!通过本实验,我们有几点心得:

    神经网络不仅仅是在学习,它具有一定的想象力!!比如它的一些看着很像的字:拜-佯, 扮-捞,笨-苯.... 这些字如果手写出来,连人都比较难以辨认!!但是大家要知道这些字在类别上并不是相领的!也就是说,模型具有一定的联想能力!不管问题多复杂,要敢于动手、善于动手。

    最后希望大家对本文点个赞,编写教程不容易。希望大家多多支持。笨教程将支持为大家输出全新的tensorflow2.0教程!欢迎关注!!

    作者:金天

    来源:https://zhuanlan.zhihu.com/p/68356509

    最新经典文章,欢迎关注公众号

    thread-27378-1-1.html

    展开全文
  • iOS 手写汉字,文字转语音,专注力训练功能实现 下载地址https://apps.apple.com/cn/app/%E9%9A%8F%E8%AE%B0%E5%AD%A6%E6%B1%89%E5%AD%97/id1556386282 开放源码
  • 主要完成人:舒文豪教授、唐降龙教授、刘家锋博士1982年,在学科带头人舒文豪教授的带领下,哈...1992年又率先研制出一套从设备硬件到分析软件都立足于国内器材的联机手写汉字输入分析系统,并获得国家专利,其图...

    主要完成人:舒文豪教授、唐降龙教授、刘家锋博士

    1982年,在学科带头人舒文豪教授的带领下,哈工大631教研室成立了文字识别研究课题组,简称文字组。在创建的初期,舒文豪教授将研究方向锁定在既探索汉字识别方法又要自行研制出便捷的汉字输入装置上。1986年研制出我国第一代手写输入板;1992年又率先研制出一套从设备硬件到分析软件都立足于国内器材的联机手写体汉字输入分析系统,并获得国家专利,其图形输入板技术居国内领先地位,其识别系统达到了国内、外先进水平。1993年联机手写体汉字输入分析系统获航空航天工业部科技进步二等奖,1995年获国家科技进步三等奖。文字组逐渐积累了丰厚的软件开发与硬件研制的经验和成果,1995年研制出“掌上型手写电脑”,它是国内第一台在软、硬件方面全部自行设计的全屏幕笔操作,笔输入的中文个人数字助理,填补了我国电子类产品的一项空白。该成果获1996年航天总公司科技进步一等奖。

    031851ea4098ac3053b78ff300b7ce9b.png

    图:百年校庆期间工大博物馆展出的我国第一代手写输入板(左)和掌上型手写电脑(右)

    1982年之后短短的十几年间,文字组共获国家、部级奖励8项,国家专利一项,在国内外发表有关汉字识别的研究论文200余篇,出版专著一部。在推动计算机在中国的普及、促进中文信息处理技术的发展等方面做出了不懈的努力。

    6ac46ca430917fb9184e931d17206771.png

    图:百年校庆期间工大博物馆展出的我国第一代联机手写体汉字输入分析系统获奖证书

    5017fc66e317d93dcc905686f715cdeb.png

    图:1990年苏联电器专家里沃夫(右一)使用第一代手写输入板时与舒文豪教授(右二)及其博士生唐降龙(左一)交流的场景。里沃夫教授是50年代在华苏联专家,在哈工大期间为创建电器专业、培养教师学生尽心尽力。

    模式识别与智能系统研究中心工大百年校庆宣传组专门采编了当年联机手写体识别项目亲历者唐降龙教授和刘家锋博士的回忆记录,分享给大家。

    哈工大开展文字识别的历史回顾 唐降龙


    一块小黑板的梦想 刘家锋

    适逢哈工大百年校庆,计算机学院也在筹备各种纪念活动。赵巍老师从研究中心的展示柜里找出了我们的初代手写板。看着这样一块小黑板,时间仿佛又回到了30年前,第一次走进电机楼老旧的文字实验室,它就摆在计算机旁。第一次见到这样一块拖着长长辫子的小黑板,完全不知道它是干什么用的,只是听着舒文豪老师兴致勃勃地谈着他的梦想,要让计算机能够认识中国人写的汉字,要让更多的中国人能够使用计算机。90年代初的计算机还是XT的时代,286386刚刚推出,操作系统也只有半图形化的中文DOS。拉丁字符的识别还是个未解决的问题,大字符集的汉字识别听起来更像是个充满了科幻色彩的梦想。之后的几年间,在舒老师、唐老师和铁才老师的带领下,几代师兄师弟共同努力,逐渐解决了大字符集的快速分类问题,解决了手写输入与中文操作系统的适配问题,梦想一步步地来到了现实。虽然在PC机可以用手写板输入汉字了,但在我们这些师兄师弟中并没有人真正使用手写的方式输入汉字,因为手写输入没有办法在速度上同键盘相比。逐渐地我们发现,只有舒老师才是手写系统的忠实用户,只有他在用笔来输入长长的文档,只有他在不断地与人畅谈他的梦想。此时的舒老师又有了一个新的梦想,我们要做出一台没有键盘、能放到口袋里的掌上中文电脑。这是一个没有ARM芯片,没有Android系统,没有互联网的时代,要实现这样的梦想,我们几乎要自己完成所有的事情。铁才老师用8051单片机设计出来了硬件系统,麻雀虽小五脏俱全,在这样一个小小的计算机中既要完成手写输入的功能,又要装入各种应用程序,石大明师弟甚至为它开发了两个小游戏,片外64K的寻址空间完全无法满足一个完整计算机系统的需要,只能依靠IO端口来扩展出更多的存储空间。在扩展空间中安排不同程序的代码空间,保证不同空间代码之间正确调用的任务落在了负责总控的王福四师兄头上。每个人的汇编代码编译之后,由他来安排装入的地址,同时在总控部分维护一个调用地址表,每当需要程序调用时,由总控根据地址表切换存储空间,实现不同程序功能之间的调用。当时,我们总是戏称王福四师兄是我们的“Linker”。就这样,我们开发出了中国第一台掌上型笔输入电脑,虽然外形粗糙、功能简陋,但已经具备了现代智能设备的雏形。在今天这个智能手机的时代,我想舒老师在天堂应该还会在手机上写着汉字,同人讲述着自己的梦想是如何落地生根,开花结果的,就是不知道老先生现在又会有了什么样的新梦想。梦想,人还要有一些的,万一哪一天实现了,还是会给我们带来不少快乐的。

    附:631专业的发展足迹

    电气工程系  电器教研室( 19531982)

    电气工程系  信息处理、显示与识别教研室(19821993)

    计算机与电气工程学院 计算机系 信息处理、显示与识别教研室(19931997)

    计算机与电气工程学院 计算机系 模式识别与智能控制教研室( 19972000 )

    计算机学院 模式识别研究中心(20002014)

    计算机学院 模式识别与智能系统研究中心(2014至今)

    展开全文
  • QT 手写识别功能的实现

    千次阅读 2019-04-25 17:00:55
    QT 手写识别功能一直网上没有很好的例子, C#的一个项目中它的手写识别功能还不错,所以在想是否可以通过QT把C#项目的手写功能拿过来。 提醒:linux用户失望了,这个仅仅是提供给windows用户的,因为C#不跨平台~ ...

       QT 调用C# 控件的实现

     (填补QT 手写识别功能的缺失问题)

     

    QT 手写识别功能一直网上没有很好的例子, C#的一个项目中它的手写识别功能还不错,所以在想是否可以通过QT把C#项目的手写功能拿过来。

     

    提醒:linux用户失望了,这个仅仅是提供给windows用户的,因为C#不跨平台~

     

     

     

    提供过程:

    一、 C# 制作类库

      这个网上有好多《详解C#制做Active控件的五个步骤》

      我引用以下别人的方法:https://blog.csdn.net/fwj380891124/article/details/8770250

      控件发布:https://www.cnblogs.com/yilin/p/csharp-activex.html

      (控件发布的意义:只是为了安装控件,在没有安装依赖库的平台上直接使用,控件安装后才能使用)

     

    我的C#的代码提供:https://download.csdn.net/download/gigizhongyan/11143879

    编译环境: NET4.6.1 + vs2015

    环境很重要,测试的时候把环境对准,不准就要深刻理解过程

     

    截图:主要用的才c#库文件

     使用我提供的代码编译成功就可以了。

    编译成功控件就注册成功了。如果在不用编译的电脑上运行,就需要制作发布版本,安装发布版本去注册。

     

    二、QT 调用active控件

    参考:QT 调用 QAxWidget播放FLASH

    https://blog.csdn.net/lmhuanying1012/article/details/78352774

    编译环境需要注意:

    注意的关键点 pro文件中加QT       += axcontainer
    QT的编译环境:5.11.2 + mingw53_32

    我的QT的代码提供:https://download.csdn.net/download/gigizhongyan/11143900

    1、C#安装包,如果不想自己去研究C#代码,那么安装注册《C# 控件安装包.rar》

    2、安装完成后用QT代码调用。如图才是正确注册的结果,否则没法调用。

    C#的控件是否安装成功可以通过ole/com object viewer 查看

    
     

     

    展开全文
  • 主要介绍了Pytorch实现的手写数字mnist识别功能,结合完整实例形式分析了Pytorch模块手写字识别具体步骤与相关实现技巧,需要的朋友可以参考下
  • 手写板在手写板的日常使用上,除用于文字、符号、图形等输入外,还可提供光标定位功能,从而手写板可以同时替代键盘与鼠标,成为一种独立的输入工具。手写板的种类电阻压力式:阻式手写板是由一层可变形的...
  • 手写汉字识别的发展综述

    万次阅读 2019-03-19 20:29:19
    一、手写汉字识别的研究背景与现状 在上个世纪60年代,美国IBM公司开始进行了对印刷体汉字的模式识别研究工作,1996年Casey和Nag用模板匹配法成功的识别出了1000个印刷体汉字,在全球范围内,汉字识别开始展开了。而...
  • 最近在做一个项目,在屏幕上需要使用手写功能,填写对某些菜品的评价,想想这种接入手写外设多简单的事情,奈何老板为了节省成本,不愿购买外设,更何况考虑到设备版本以及电脑主板兼容性的问题,放弃了外设的想法,...
  • ziddo紫貂手写板驱动是适用于该手写板使用的一款驱动程序,安装驱动后可将手写板连接电脑,手写板...ziddo紫貂手写板介绍紫貂电脑手写板流畅迅速,软件界面操作简洁明了,功能全面。该版本驱动支持连笔书,欢迎下载体验
  • 手写汉字识别,本文采用模板匹配的方法,进行识别,模板匹配方法的通用性大家都很了解,你可以在本代码的基础上改善新的功能
  • 免费轻松识别手写汉字工具-python

    千次阅读 热门讨论 2018-10-09 09:50:11
    免费轻松识别手写汉字工具-python话不多说,先上效果图!开发过程小工具打包为.exe程序了。[下载连接](https://download.csdn.net/download/puremilkll/10707679) 话不多说,先上效果图! 这是需要识别的手写汉字: ...
  • 有了这个API我们可以实现很多创意,比如稍微改进下上面的代码就可以实现手写文字的连续识别功能,一边写一边不断的识别,封装进平板就是一款可以实时识别手写板啦。 关注我的公众号一起玩转技术
  • 手写借助强大的中文识别能力,丰富的词条联想功能,任何不懂中文输入法的网民也可流畅完成中文输入,其体积小巧,实用方便。自发布以来得到了众多低端网民与电脑初学者的肯定与
  • 基于卷积神经网络的手写字体识别(汉字、数字均可)Matlab GUI 前言 记录一下,基于贝叶斯函数的matlab是手写汉字识别,准确率还可以,可以识别汉字、数字、字母 程序及界面放在资源里了,由于是帮别人做的,仅提供...
  • 首先要处理接收请求中文乱码问题: request.setCharacterEncoding("utf-8"); 然后解决响应给浏览器的乱码问题: //解决响应体乱码问题 response.setContentType("text/html;charset=utf-8"); 说明:上述只是解决...
  • TensorFlow与中文手写汉字识别

    万次阅读 多人点赞 2017-05-25 14:12:19
    TensorFlow练习22: 手写汉字识别 , 但是这篇文章只用了140训练与测试,试了下代码 很快,但是当扩展到所有的时,发现32g的内存都不够用,这才注意到原文中都是用numpy,会先把所有的数据放入到内存,但这个不必须的...
  • 以往,我们习惯以签名作为赋予文件法律效力的手段。...如果你存在这样的困扰,法大大手写签名识别功能绝对是你的不二选择。 手写签名识别功能是什么?|签名真实性验证 手写签名识别是法大大针对正在进行数字...
  • GAN代码解析(tensorflow实现)_手写数字图片生成 基于py3.0支持中文名方法, 如果报错请把中文方法名,改为英文的 #coding:utf-8 # MNIST数据集 # MNIST数据集的官网是Yann LeCun’s website。在这里,我们提供了一...
  • OCR 脱机手写汉字识别与印刷汉字识别
  • iOS简单的手写汉字识别

    千次阅读 2015-06-13 16:09:55
    前一阵在班讯通上边加了一个小的功能:根据拼音提示写出汉字,提交之后软件会打出分数,其界面如下: 下面简单介绍一下第一个版本识别算法的实现: 记录汉字录入轨迹 iOS中UIView视图继承了UIResponder类,该...
  • 基于Pytorch的手写汉字识别

    千次阅读 2020-07-31 16:29:54
    基于Pytorch的手写汉字识别说明数据集代码解析导入库argparse模块——对参数进行设置提取图片路径生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是...
  • 之前毕业设计用TensorFlow做了手写汉字识别,使用的中科院的数据集。 现在用Pytorch复现一下。 下载链接在文末
  • 针对手写汉字字形变化复杂的特点,提出了一种基于特征向量分布的多模板字典制作方法,并通过赋予该多模板字典自学习功能,来提高其泛化能力。实验证明,用这种方法制作的字典与用传统方法制作的同类字典相比,能够...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 15,705
精华内容 6,282
关键字:

下载手写功能中文手写