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

相关源码和文档获取请私聊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.rhkb.cn/news/234162.html

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

相关文章

Qt pro文件

1. 项目通常结构 2.pri文件 pri文件可定义通用的宏&#xff0c;例如创建一个COMMON.pri文件内容为 COMMON_PATH D:\MyData 然后其它pri或者pro文件如APPTemplate.pro文件中通过添加include(Common.pri) &#xff0c;QtCreator就会自动在项目结构树里面创建对应的节点 3.变量…

3D人体姿态估计

3D人体姿态估计是指通过算法对输入的图像或视频进行分析&#xff0c;推断出人体的三维姿态信息。该技术可以应用于许多领域&#xff0c;如虚拟现实、运动分析、人机交互等。 1. 算法原理&#xff1a; 3D人体姿态估计利用深度学习模型作为算法的核心&#xff0c;通过网络学习人…

【web】springboot3 生成本地文件 url

文章目录 流程效果静态资源访问ServiceServiceImplController 流程 avatar_dir&#xff1a;请求图片在服务端的存放路径user.dir&#xff1a;项目根目录 效果 静态资源访问 application.yml 设置静态文件存储路径custom:upload:avatar_dir: ${user.dir}/avatar_dir/avatar_d…

GO语言笔记2-变量与基本数据类型

变量使用步骤 声明赋值使用 package main import "fmt" func main(){var age int //声明一个 int类型的变量叫ageage 18 //给变量用 赋值fmt.Println(age) //使用变量 输出变量的值 } 编译运行输出变量值 变量的四种使用方式 package main import "fmt&q…

金和OA C6 HomeService.asmx SQL注入漏洞复现

0x01 产品简介 金和网络是专业信息化服务商,为城市监管部门提供了互联网+监管解决方案,为企事业单位提供组织协同OA系统开发平台,电子政务一体化平台,智慧电商平台等服务。 0x02 漏洞概述 金和OA C6 HomeService.asmx接口处存在SQL注入漏洞,攻击者除了可以利用 SQL 注入漏洞…

MiniTab的正态性检验结果的分析

正态性检验概述 可使用 正态性检验 确定数据是否不服从正态分布。 执行菜单&#xff1a;要执行正态性检验&#xff0c;请选择统计 > 基本统计 > 正态性检验。 正态性检验 的假设 对于正态性检验&#xff0c;进行如下假设。 H0&#xff1a;数据服从正态分布。H1&…

【VUE】无法加载文件 \node\vue.ps1,因为在此系统上禁止运行脚本。问题解决

问题描述 在VS Code中输入vue create -p dcloudio/uni-preset-vue uniapp-demo命令时报错 无法加载文件 D:\address\node\vue.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Executi…

数据结构之B树和B+树

数据结构可视化演示链接&#xff0c;也就是视频中的网址 文章目录 一、B-Tree二、BTree(B-Tree变种) 一、B-Tree 样例图 叶节点具有相同的深度&#xff0c;叶节点的指针为空所有索引元素不重复节点中的数据索引从左到右递增排列 二、BTree(B-Tree变种) 样例图 非叶子节…

水文模型(科普类)

SWMM 模型概况&#xff1a; SWMM5 系列拥有编辑区域数据的功能&#xff0c;而且能模拟水文、 水力和水质。其核心部分是管道汇流计算模块&#xff0c;提供了恒定流法、运动波法和动力波法三种水动力学 方法。其中动力波法通过求解完整的圣维南方 程组进行计算&#xff0c;能够…

【代码随想录】刷题笔记Day48

前言 早上练车去了&#xff08;好久没有8点前醒了&#xff09;&#xff0c;练科目二两小时下来脚根可真酸啊&#xff0c;希望下周一把过。练完顺带去Apple西湖免费换新了耳机&#xff0c;羊毛爽&#xff01; 121. 买卖股票的最佳时机 - 力扣&#xff08;LeetCode&#xff09;…

三分钟轻松搞懂 HashMap 死循环问题!

三分钟轻松搞懂 HashMap 死循环问题&#xff01; HashMap 死循环发生在 JDK 1.7 版本中&#xff0c;形成死循环的原因是 HashMap 在 JDK 1.7 使用的是头插法&#xff0c;头插法 链表 多线程并发 HashMap 扩容&#xff0c;这几个点加在一起就形成了 HashMap 的死循环。 前置…

考虑柔性负荷的综合能源系统低碳经济优化调度【复现】

随着低碳发展进程的不断推进&#xff0c;综合能源系统&#xff08;IES&#xff09;逐渐成为实现减排目标的重要支撑技术。 基于能 源集线器概念&#xff0c;结合需求侧柔性负荷的可平移、可转移、可削减特性&#xff0c;构建了含风光储、燃气轮机、柔性负荷等 在内的 IES 模型。…

Java中SpringBoot组件集成接入【MQTT中间件】

Java中SpringBoot组件集成接入【MQTT中间件】 1.MQTT介绍2.搭建MQTT服务器1.Windows2.Ubuntu3.Docker4.其他方式3.mqtt可视化客户端MQTTX及快速使用教程4.SpringBoot接入MQTT1、maven依赖2、MQTT配置3、MQTT组件具体代码1.定义通道名字2.消息发布器3.MQTT配置、生产者、消费者4…

算法回忆录——排序

文章目录 1. 插入排序2. 选择排序3. 冒泡排序4. 希尔排序5. 归并排序6. 快速排序7. 堆排序8. 计数排序9. 桶排序10. 基数排序 1. 插入排序 分为两个序列&#xff0c;前面一个序列是排好序的&#xff0c;后面一个序列是未排好的。未排好的序列的第一个元素&#xff08;a&#x…

Vmware安装Windows11系统及下载MySQL步骤(超详细)

一、创建虚拟机 ①选择自定义 ②直接点击下一步 ③选择Windows 11 x64 ④命名虚拟机以及选择路径 ⑤新版本的虚拟机需要加密&#xff08;密码需要8个字符以上&#xff09; ⑥选择UEFI ⑦处理器配置&#xff08;根据自己的需求&#xff09; ⑧设置虚拟机的内存 ⑨选择不使用网络…

Linux安装JDK和Maven并配置环境变量

文章目录 一、安装JDK并配置环境变量二、安装maven并配置环境变量 一、安装JDK并配置环境变量 将JDK的安装包上传到Linux系统的usr/local目录 使用xftp上传文件 解压JDK的压缩包 xshell连接到云主机 [roottheo ~]# cd /usr/local[roottheo local]# ls aegis apache-tomcat-…

【Docker基础三】Docker安装Redis

下载镜像 根据自己需要下载指定版本镜像&#xff0c;所有版本看这&#xff1a;Index of /releases/ (redis.io) 或 https://hub.docker.com/_/redis # 下载指定版本redis镜像 docker pull redis:7.2.0 # 查看镜像是否下载成功 docker images 创建挂载目录 # 宿主机上创建挂…

2024年跨境电商上半年营销日历,建议收藏

2024年伊始&#xff0c;跨境电商开启新一轮的营销竞技&#xff0c;那么首先需要客户需求&#xff0c;节假日与用户需求息息相关&#xff0c;那么接下来小编为大家整理2024上半年海外都有哪些节日和假期&#xff1f;跨境卖家如何见针对营销日历选品&#xff0c;助力卖家把握2024…

Wrk压测发送Post请求的正确姿势

一、Wrk简介 wrk 是一个能够在单个多核 CPU 上产生显著负载的现代 HTTP 基准测试工具。它采用了多线程设计&#xff0c;并使用了像 epoll 和 kqueue 这样的可扩展事件通知机制。此外&#xff0c;用户可以指定 LuaJIT 脚本来完成 HTTP 请求生成、响应处理和自定义报告等功能。 …

OpenAI ChatGPT-4开发笔记2024-03:Chat之Tool和Tool_Call(含前function call)

Updates on Function Calling were a major highlight at OpenAI DevDay. In another world,原来的function call都不再正常工作了&#xff0c;必须全部重写。 function和function call全部由tool和tool_choice取代。2023年11月之前关于function call的代码都准备翘翘。 干嘛…