基于神经网络的手写汉字提取与书写评分系统研究

相关源码和文档获取请私聊QQ:3106089953

论文目录结构

目 录
摘 要 I
Abstract II
目 录 IV
第1章 绪论 1
1.1. 研究背景与意义 1
1.2. 国内外研究现状 2
1.2.1. 文本定位技术研究现状 2
1.2.2. 手写汉字识别研究现状 3
1.2.3. 汉字书写质量评价方法研究现状 4
1.3. 本文所做工作 4
1.4. 论文结构安排 5
第2章 系统需求分析及概要设计 6
2.1. 可行性分析 6
2.2. 系统用例分析 7
2.2.1. 用例表设计 7
2.3. 功能需求分析 9
2.4. 性能需求分析 10
2.5. 系统总体设计 10
2.5.1. 系统总体架构设计 10
2.5.2. 系统功能模块设计 12
2.6. 相关技术介绍 13
2.6.1. Android系统 13
2.6.2. OpenCV视觉库 14
2.6.3. TensorFlow开源库 14
2.7. 本章小结 14
第3章 系统详细设计及实现 16
3.1. 系统模块详细设计 16
3.2. 笔画提取模块 16
3.2.1. 单帧图像的疑似笔画像素点检测 17
3.2.2. 基于帧差法的笔画增长点检测 19
3.2.3. 笔画切换点检测与单笔画的提取 20
3.3. 基本笔画识别模块 22
3.3.1. 汉字的基本笔画 22
3.3.2. LeNet-5网络 23
3.4. 书写评分模块 25
3.4.1. 重心特征 27
3.4.2. 网格特征 27
3.4.3. 整字综合评分 27
3.5. 系统UI界面 28
3.6. 本章小结 30
第4章 系统性能测试 31
4.1. 测试的意义与方法 31
4.2. 运行性能测试 32
4.2.1. 测试设备 32
4.2.2. 测试环境 32
4.3. 本章小结 33
总结 34论文工作总结 34
工作展望 34
参考文献 35
致谢 37

相关目录的具体内容

2.3.功能需求分析
系统的用例分析是从用户操作的角度对系统进行设计,对于系统的功能需求分析,是以开发者的角度进行设计,即对系统的用例图及用例描述进行详细定义与描述,给开发人员作为参考。所有功能均与系统用例一一对应。
1)录制书写过程
该功能通过用户点击按钮触发,软件获取系统摄像头使用权限,开启摄像头,进行视频录制,直至用户点击按钮结束录制。输出mp4多媒体格式文件并传递给下一模块。
2)报告书写正确性
该功能触发前,需要用户输入书写的汉字,以供系统使用相应的模板特征数据与输入数据进行对比分析。系统对录制好的书写过程视频进行计算,提取出单一笔画,通过笔画识别、特征比对等方式得到书写正确性结果。书写正确性包括笔画类型、笔画位置、笔画顺序等方面的正确性。报告结果在文本框中以文本方式显示。后台给出笔画状态编码列表,前端对其映射得到对应文本。
3)显示书写改正建议
该功能依赖于报告书写正确性功能的分析结果。改正建议类型与正确性类型相对应,因此同样使用映射得到对应的建议文本,在前端的文本框中显示。
4)显示书写评分
该功能与报告书写正确性、显示书写改正建议一同显示。后台对单一笔画、整字分别通过特征比对法计算评分,最后将其权值相加以百分制形式给出用户的综合书写评分。
2.4.性能需求分析
系统的功能需求仅仅可以确定系统的任务,但是为了让系统的能够更长久且无误的运行,还需要进行系统的性能需求分析。系统的性能需求是按照系统的功能需求以及系统本身的特性所设定的。将从系统的开发、系统的运行以及部署等多个方面,进行性能的提取。当系统的性能满足需求后,系统的生命周期才会满足预估,且也会使得系统的功能更加完备。
1.可靠性
系统需要具备一定的可靠性,即用户完成视频输入后,在设备运行内存充足的情况下,系统应该在5秒内完成计算,给出反馈结果。
2.容错性
用户在进行功能操作时,若输入了错误的数据,如用户在汉字书写过程中,出现连笔、错字的情况等,用户在输入信息时输入了错误的形式信息后,系统不会自动闪退或崩溃,而是将这些错误情况进行捕捉,并显示哪里出错,让用户进行及时更改。
3.可维护性
系统需要具备一定的可维护性,随着后续的算法优化与替换,书写评价功能的增加等,所有的模块均应该是可维护的,且可增加、替换或者删除的,系统在设计过程中需要达到高内聚低耦合的状态。
2.5.系统总体设计
2.5.1.系统总体架构设计
系统总体架构设计是指按照多种角度进行分层,本系统的总体架构如图2-2所示。系统可分为访问层、前端UI、业务层、数据层及基础设施层[15]。
对于访问层,有Android移动端及安卓用户作为终端。系统的所有功能均是通过这一硬件进行数据计算与显示的。
前端UI对应系统的页面展示与用户交互,该系统部署在App端,使用Android操作系统,以PyQt5作为GUI开发框架,本文转载自http://www.biyezuopin.vip/onews.asp?id=14866需要完成对Activity的编写以及Video的读写。
系统的业务层是将系统的功能以业务逻辑的形式展示在系统的总体架构图中。对于用户,主要包含录取视频、选择汉字等业务逻辑功能。对于后台的业务逻辑主要包含视频录制模块、书写评价模块,其中视频录制模块包括录取视频,书写评价模块包括笔画提取、笔顺判别、文本定位与切割、书写评分等功能。
数据层主要包含了数据的存储过程、数据缓存、文件读写等数据操作。
基础设施层对应了系统的物理架构所需要的硬件设备,包括操作系统、摄像头、CPU等。

部分代码展示

import cv2
import sys
import numpy as np
from matplotlib import pyplot as plt
import pickle
from text_location import *char_feat_path = './utils/character_feature_dict'
stroke_feat_path = './utils/stroke_feature_dict'def gravity_core(img):  # 计算汉字的重心特征向量'''计算汉字的重心特征向量----------:param img [ndarray]: 笔画二值图像,笔画为白色:return [list]: 归一化的重心坐标:return [list]: 绝对重心坐标'''h, w = img.shapex_axis = 0y_axis = 0total = np.sum(img[:, :])for row in range(h):y_axis += row * np.sum(img[row, :])Gy = y_axis / totalfor col in range(w):x_axis += col * np.sum(img[:, col])Gx = x_axis / total#除是进行了归一化处理,消除了输入图像分辨率的差异对评分的影响return [Gx/w, Gy/h], [Gx, Gy]def grid_vector(img, n_divide = 3):   # 计算图像的网格特征向量'''计算汉字的网格特征向量----------:param img [ndarray]: 笔画二值图像,笔画为白色:param n_divide [int]: :return [list]: '''w, h = img.shapespanX = int(w/n_divide)spanY = int(h/n_divide)grid_area = spanX * spanYleft_border = 0up_border = 0grid_vector = []#求出每一个矩阵的特征值for row in range(n_divide):left_border = 0for col in range(n_divide):white_num = np.sum(img[up_border:up_border+spanY, left_border:left_border+spanX])#在这个矩形之中 一共有多少个方格是有白色像素的,然后除以这个矩形的面积grid_vector.append(white_num / grid_area)left_border += spanXup_border += spanYreturn grid_vectordef cosine_similarity(vec1, vec2):'''计算向量余弦相似度----------:param vec1 [list]: 向量1,元素应为可计算数值:param vec2 [list]: 向量2,元素应为可计算数值:return [float]: 相似性数值,取值范围为[-1,1]'''#求余弦相似度的公式sim = np.dot(vec1, vec2) / (np.linalg.norm(vec1)*np.linalg.norm(vec2))return simdef stroke_score(stroke_list, char_id, dict_path, gravity_ratio=0.2):'''根据单笔画分别评分----------:param img [ndarray]: 笔画二值图像列表,笔画为白色:param char_id [str]: 汉字编号:param dict_path [str]: 模板特征字典文件路径:param gravity_ratio [float]: 重心特征评分所占比例,为0到1之间的值:return [float]: 笔画评分'''if gravity_ratio>1.0 or gravity_ratio<0:print("单笔画重心评分比例错误,应为0到1之间的值")gravity_ratio = 0.2grid_ratio = 1.0 - gravity_ratiopattern_feat = []score = []with open(dict_path, 'rb') as f:dict = pickle.load(f)pattern_feat = dict[char_id]if len(pattern_feat):if len(pattern_feat)==len(stroke_list):for i in range(len(pattern_feat)):  # 对每个笔画分别计算特征向量,计算评分gravity, _ = gravity_core(stroke_list[i])   #重心特征grid = grid_vector(stroke_list[i])              #网络特征gravity_similarity = cosine_similarity(gravity, pattern_feat[i][0])grid_similarity = cosine_similarity(grid, pattern_feat[i][1])# testprint("单笔画重心评分", gravity_similarity)print("单笔画网格评分", grid_similarity)print()# 这是笔画的评分score.append(gravity_similarity * gravity_ratio + grid_similarity * grid_ratio)return np.mean(score)else:print("【ERROR】 笔画图片数量与模板不一致!")sys.exit(0)return -1else:print("模板数据丢失!")return -1
#上面是检测单个笔画的,这个是整个字的,用的方法是一模一样
def char_score(char_img, char_id, dict_path, gravity_ratio=0.2):'''对整字进行评分----------:param img [ndarray]: 汉字二值图像,文字部分为白色:param char_id [str]: 汉字编号:param dict_path [str]: 模板特征字典文件路径:param gravity_ratio [float]: 重心特征评分所占比例,为0到1之间的值:return [float]: 整字评分'''if gravity_ratio>1.0 or gravity_ratio<0:print("单笔画重心评分比例错误,应为0到1之间的值")gravity_ratio = 0.2grid_ratio = 1.0 - gravity_ratiowith open(dict_path, 'rb') as f:dict = pickle.load(f)pattern_feat = dict[char_id]if len(pattern_feat):gravity, _ = gravity_core(char_img)grid = grid_vector(char_img)gravity_similarity = cosine_similarity(gravity, pattern_feat[0])grid_similarity = cosine_similarity(grid, pattern_feat[1])# testprint("整字重心评分", gravity_similarity)print("整字网格评分", grid_similarity)print()return (gravity_similarity * gravity_ratio + grid_similarity * grid_ratio)else:print("模板数据丢失!")return -1def aesthetic_score(stroke_list, char_id):'''计算汉字的书写质量综合评分----------:param stroke_list [list]: 笔画二值图像列表,笔画为白色:return [float]: 书写评分'''# 计算单笔画评分strokes_score = stroke_score(stroke_list, char_id, stroke_feat_path)# 计算整字评分char_img = img_merge(stroke_list)character_score = char_score(char_img, char_id, char_feat_path)# 权值相加得到综合评分stroke_ratio = 0.5char_ratio = 1.0 - stroke_ratiofinal_score = strokes_score * stroke_ratio + character_score * char_ratioreturn final_scoreif __name__ == '__main__':stroke_list = []for i in range(4):img = cv2.imread("./test_video/strokes/" + str(i) + ".jpg")img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)stroke_list.append(img)stroke_list = text_location(stroke_list)    # 文本定位与切割score = aesthetic_score(stroke_list, '0750')print(score)

项目运行图片展示

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/610822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux驱动开发(1)-最简单的字符设备驱动开发例子

1.简介 字符设备驱动&#xff1a;按照字节流进行读写操作的设备&#xff0c;例如点灯、按键、IIC、SPI、LCD。 Linux系统中一切皆文件&#xff0c;驱动加载成功&#xff0c;就会在/dev目录生成文件&#xff0c;对文件操作&#xff0c;则可实现对硬件操作。应用程序运行在用户…

Leetcode242有效的字母异位词(java实现,详细易懂想学会的进!!!)

今天给大家分享的题目是leetcode242有效的字母异位词 我们先看题目描述&#xff1a; Chatgpt中对于字母异位词的解释如下&#xff1a; 字母异位词是指由相同的字母组成但顺序不同的单词。换句话说&#xff0c;字母异位词具有相同的字母&#xff0c;只是排列顺序不同。 简单的将…

华云安攻击面发现及管理平台体验

省流&#xff1a; 无需【立即咨询】即可体验&#xff0c;开通即可查看演示数据&#xff0c;公开报价 界面&#xff1a; 界面简洁&#xff0c;要点清晰&#xff0c;可以清晰的看到暴露面及攻击面信息 功能&#xff1a; 资产发现&#xff1a;主域名发现、子域名发现、 IP 发现…

Set和Map

一、Set的介绍 1.1、Set相关文档介绍 cplusplus.com/reference/set/set/?kwset 1. set是按照一定次序存储元素的容器 2. 在set中&#xff0c;元素的value也标识它(value就是key&#xff0c;类型为T)&#xff0c;并且每个value必须是唯一的。 set中的元素不能在容器中修改…

时空序列问题的本质和底层逻辑

本质&#xff1a;Still need to polish this. 底层逻辑&#xff1a;Still need to polish this.See you pretty soon. Reference 【时空序列预测】什么是时空序列问题&#xff1f;这类问题主要应用了哪些模型&#xff1f;主要应用在哪些领域&#xff1f;_mb62b92582e5a0a的技…

【算法刷题】Day28

文章目录 1. 买卖股票的最佳时机 III题干&#xff1a;算法原理&#xff1a;1. 状态表示&#xff1a;2. 状态转移方程3. 初始化4. 填表顺序5. 返回值 代码&#xff1a; 2. Z 字形变换题干&#xff1a;算法原理&#xff1a;1. 模拟2. 找规律 代码&#xff1a; 1. 买卖股票的最佳时…

我是如何从计算机小白成长为技术专家的(上)?

作为一名程序员&#xff0c;我想大家接触最多的是计算机吧&#xff0c;但是一个从没有接触过计算机的小白&#xff0c;又是如何走上程序员的道路的呢。 农村的孩子&#xff0c;早当家 作为农村出身的孩子&#xff0c;且家里条件也不是非常的好&#xff0c;在我那个年代&#…

Linux网络配置与抓包工具介绍

目录 一、配置命令 1. ifconfig 1.1 概述信息解析 1.2 常用格式 2. ip 2.1 ip link 数据链路层 2.2 ip addr 网络层 2.3 路由 3. hostname 3.1 临时修改主机名 3.2 永久修改主机名 4. route 5. netstat 6. ss 7. ping 8. traceroute 9. nslookup 10. 永久修…

springcloud Config配置中心

简介 服务意味着要将单体应用中的业务拆分成一个个子服务&#xff0c;每个服务的粒度相对较小&#xff0c;因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行&#xff0c;所以一套集中式的、动态的配置管理设施是必不可少的。 SpringCloud提供了ConfigS…

Android SDK环境搭建

一、Android SDK简介 SDK&#xff1a;&#xff08;software development kit&#xff09;软件开发工具包。被软件开发工程师用于为特定的软件包、软件框架、硬件平台、操作系统等建立应用软件的开发工具的集合。 因此&#xff0c;Android SDK 指的是Android专属的软件…

【Java集合篇】HashMap的remove方法是如何实现的?

HashMap的remove方法是如何实现的 ✔️典型解析✔️拓展知识仓✔️HashMap的remove方法的注意事项✔️HashMap的remove方法的参数类型✔️ 删除键和值的参数类型有什么区别✔️删除键值对的场景是什么 ✔️HashMap remove方法是阻塞队列的吗✔️HashMap remove方法是线程安全的…

如何使用web文件管理器Net2FTP搭建个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Linux 常用指令汇总

Linux 常用指令汇总 文章目录 Linux 常用指令汇总[toc]前言一、文件目录指令pwd 指令ls 指令cd 指令mkdir 指令rmdir 指令tree 指令cp 指令rm 指令mv 指令cat 指令more 指令less 指令head 指令tail 指令echo 指令> 指令>> 指令 二、时间日期指令date 指令cal 指令 三、…

Mars3D与mars3d-cesium版本间兼容造成3dtiles和gltf数据处理相关记录

说明&#xff1a; 1.在引入Mars3D SDK后正常可以在F12打印的信息中可以看到Mars3D和Cesium版本信息。 2.在项目的package.json文件中同样可以看到安装后的版本号。 Mars3D对Cesium版本对应关系&#xff1a; 1.正常情况下mars3d依赖的cesium均是最新版本&#xff0c;并且对cesi…

53K star! 平替TeamViewer,试试这个开源神器

还记得以前工作上遇到困难&#xff0c;会申请开发大神远程帮忙&#xff0c;那时候用都是TeamViewer&#xff0c;但是随着TeamViewer的收费&#xff0c;这些都已成为过往。 今天我们推荐的开源项目就是让你可以轻松平替TeamViewer&#xff0c;一款远程桌面神器&#xff0c;本项…

Antd使用table同时使用scroll和fixed定位,滑动导致左右高度不统一

今天使用组件里Table时候&#xff0c;遇到一个业务场景就是在有scroll控制滚动条的同时&#xff0c;固定部分列&#xff0c;就出现的如题的bug 问题&#xff1a;无法对齐 代码&#xff1a; <TabledataSource{data}scroll{{ y: calc(100vh - 275px), x: 1200px }}columns{t…

智能合约介绍

莫道儒冠误此生&#xff0c;从来诗书不负人 目录 一、什么是区块链智能合约? 二、智能合约的发展背景 三、智能合约的优势 四、智能合约的劣势 五、一些关于智能合约的应用 总结 一、什么是区块链智能合约? 智能合约&#xff0c;是一段写在区块链上的代码&#xff0c;一…

Simpy简介:python仿真模拟库-03/5

一、说明 在过去的两篇文章中&#xff0c;我们了解了 simpy 的基础知识、声明变量和处理表达式。值得注意的例子包括评估导数和积分。现在&#xff0c;让我们继续使用函数。 二、SymPy — 函数类 SymPy 包包含 sympy.core.function 模块中的 Function 类。该类作为各种数学函数…

构建labelstudio镜像的时候,报错node:18,如何解决

解决方案&#xff1a; vi Dockerfile # syntaxdocker/dockerfile:1.3 FROM --platformlinux/amd64 node:18.16-bullseye-slim AS frontend-builder18改成 18.16-bullseye-slim

【漏洞复现】锐捷EG易网关login.php命令注入漏洞

Nx01 产品简介 锐捷EG易网关是一款综合网关&#xff0c;由锐捷网络完全自主研发。它集成了先进的软硬件体系架构&#xff0c;配备了DPI深入分析引擎、行为分析/管理引擎&#xff0c;可以在保证网络出口高效转发的条件下&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化…