若该文为原创文章,未经允许不得转载
原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/86612009
各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究

Qt之手写识别开发笔记:Zinnia介绍、编译、使用以及Demo

前话

项目中有手写输入识别需求,转而研究手写输入算法。

Zinnia介绍

zinnia是一个开源的手写识别库,采用C++实现,具有手写识别,学习以及文字模型数据制作转换等功能,且该库拥有较好的可移植性。

zinnia手写输入为用户笔画坐标作为一系列坐标数据,并输出按SVM置信度排序的n个最佳字符。

zinnia库具备以下特点:

  • 支持向量机的实用精度
  • 便携紧凑的设计 - POSIX / Windows(取决于C ++ / STL)
  • 线程安全的C / C ++ / Perl / Ruby / Python
  • 实用识别速度(50-100 /秒)
  • 快速培训

Zinnia库下载

下载地址:https://github.com/taku910/zinnia

(zinnia主页所指下载地址已经404…)

提供csdn下载地址:https://download.csdn.net/download/qq21497936/10934234

使用VS2017编译Zinnia库

步骤一:打开VS2017命令行工具,切换到源码目录

步骤二:编译,使用指令”nmake -f Makefile.msvc”

就这么轻松愉快的编译完了,如下图:

将其模块化,参照jpeglib的模块化方法:https://blog.csdn.net/qq21497936/article/details/86155043

训练模型文件

为了给zinnia提供识别的基础数据,需要制作训练数据,训练数据用S表达式编写。一般而言,更多数据会产生更好的质量。到目前为止,百日草只支持批量训练,涉及到3个应用,如下:

  • zinnia_learn.exe:用于对指定元数据进行学习;
  • zinnia_convert程序将文本模型转换为二进制模型,可以压缩;
  • zinnia.exe:我们用于测试模型识别文件;

模型文件格式

(character (value あ) (width 300) (height 300) (strokes ((54 58)(249 68)) ((147 10)(145 201)(182 252)) ((224 103)(149 230)(82 240)(53 204)(86 149)(182 139)(240 172)(248 224)(228 250))))
(character (value い) (width 300) (height 300) (strokes ((56 63)(43 213)(67 259)(94 243)) ((213 66)(231 171)(208 217))))
(character (value う) (width 300) (height 300) (strokes ((102 35)(187 45)) ((73 121)(167 105)(206 139)(198 211)(135 275))))
(character (value え) (width 300) (height 300) (strokes ((140 19)(162 38)) ((62 105)(208 100)(51 263)(128 205)(188 268)(260 252))))
(character (value お) (width 300) (height 300) (strokes ((64 94)(240 98)) ((148 35)(159 129)(140 199)(105 247)(64 228)(101 161)(192 161)(222 223)(189 257)) ((223 49)(253 89))))

训练模型(可进行压缩)

得到模型文件data.mode(二进制),至于多生成得data.mode.txt(文本文件)是一种独立于体系结构得格式,zinnia只能添加二进制文件,但是截图对比预留出来,以后也许用得到呢?

输入文件格式

实际与模型文件格式类似,只是少了“(value う)”这一段,如下:

(character (width 300) (height 300) (strokes ((54 58)(249 68)) ((147 10)(145 201)(182 252)) ((224 103)(149 230)(82 240)(53 204)(86 149)(182 139)(240 172)(248 224)(228 250))))
(character (width 300) (height 300) (strokes ((56 63)(43 213)(67 259)(94 243)) ((213 66)(231 171)(208 217))))
(character (width 300) (height 300) (strokes ((102 35)(187 45)) ((73 121)(167 105)(206 139)(198 211)(135 275))))
(character (width 300) (height 300) (strokes ((140 19)(162 38)) ((62 105)(208 100)(51 263)(128 205)(188 268)(260 252))))
(character (width 300) (height 300) (strokes ((64 94)(240 98)) ((148 35)(159 129)(140 199)(105 247)(64 228)(101 161)(192 161)(222 223)(189 257)) ((223 49)(253 89))))

测试识别(直接使用模型文件)

zinnia.exe -m data.model test.txt

使用模型”data.model”(二进制,非文本的),输入的文件为”test.txt”

由此,我们可以看出zinnia库识别的特点,应该是相似度,相似度越高越在前面,越低在越后面,那么风马牛不相及也有个相似度(负数),应该都能输出,我们取前面一部分(约5-10个)就好了,其实也可以取相似度,我们仔细查看识别出的数据特点,分析如下图:

所以根据数据特点,果断给这个下定义,认为就是相似度(阅读代码实际也是,相似得分)。

使用VS2017建立C++程序测试Demo

步骤一:建立VC++空工程

参照jpeglib测试demo:https://blog.csdn.net/qq21497936/article/details/86155043

步骤二:加入头文件路径,库路径,库命,在代码中添加引入库

参照jpeglib测试demo:https://blog.csdn.net/qq21497936/article/details/86155043

步骤三:拷贝代码 (注意运行代码,需要拷贝之前建立的模型data.model)

#include <iostream>
#include "zinnia.h"static const char *input =
"(character (width 1000)(height 1000)"
"(strokes ((243 273)(393 450))((700 253)(343 486)(280 716)(393 866)(710 880))))";#pragma comment(lib, "libzinnia.lib")int main(int argc, char **argv) {zinnia::Recognizer *recognizer = zinnia::Recognizer::create();if (!recognizer->open("D:\\compile\\zinnia\\Demo\\Debug\\data.model")) {std::cerr << recognizer->what() << std::endl;return -1;}// 第一次识别(输入文件)zinnia::Character *character = zinnia::Character::create();if (!character->parse(input)) {std::cerr << character->what() << std::endl;return -1;}{zinnia::Result *result = recognizer->classify(*character, 1);if (!result) {std::cerr << recognizer->what() << std::endl;return -1;}for (size_t i = 0; i < result->size(); ++i) {std::cout << "parse input i = " << i << " result = " << result->value(i)    << "\t score = " << result->score(i) << std::endl;}delete result;}// 第二次识别(函数输入特征点)character->clear();character->set_width(300);character->set_height(300);character->add(0, 51, 29);character->add(0, 117, 41);character->add(1, 99, 65);character->add(1, 219, 77);character->add(2, 27, 131);character->add(2, 261, 131);character->add(3, 129, 17);character->add(3, 57, 203);character->add(4, 111, 71);character->add(4, 219, 173);character->add(5, 81, 161);character->add(5, 93, 281);character->add(6, 99, 167);character->add(6, 207, 167);character->add(6, 189, 245);character->add(7, 99, 227);character->add(7, 189, 227);character->add(8, 111, 257);character->add(8, 189, 245);{zinnia::Result *result = recognizer->classify(*character, 1);if (!result) {std::cerr << recognizer->what() << std::endl;return -1;}for (size_t i = 0; i < result->size(); ++i) {std::cout << "parase input i = " << i << " result = " << result->value(i) << "\t score = " << result->score(i) << std::endl;}delete result;}delete character;delete recognizer;getchar();return 0;
}

Demo效果

如下图,模型只有5个,所以不准,框架搭好,下一步节主要研究数据模型:

Demo下载地址

https://download.csdn.net/download/qq21497936/10934243

拓展1:文本模型可转换为c/c++源文件

(略)

拓展2:模型可进一步压缩(损失识别精度)

原博主博客地址:https://blog.csdn.net/qq21497936
原博主博客导航:https://blog.csdn.net/qq21497936/article/details/102478062
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/86612009

Qt之手写识别开发笔记:Zinnia介绍、编译、使用以及Demo相关推荐

  1. 使用zinnia库进行中文手写识别

    研究手写识别的时候看到了zinnia,就进行了测试,存在问题是zinnia书写依赖笔画顺序,而且没有找到更多的可以用于训练的数据. zinnia介绍 zinnia是一个基于svm的开源的手写识别库.z ...

  2. 基于Aforge的手势识别之一~~~简单的手写识别

    本文来自http://blog.csdn.net/hellogv/ ,引用必须注明出处! 上一篇文章介绍了如何用Aforge去捕捉运动物体,现在就介绍一个更深入的操作----手势识别.       我 ...

  3. (手写识别) Zinnia库及其实现方法研究

    Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...

  4. AI应用开发实战 - 手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  5. AI应用开发实战系列之三:手写识别应用入门

    AI应用开发实战 - 手写识别应用入门 手写体识别的应用已经非常流行了,如输入法,图片中的文字识别等.但对于大多数开发人员来说,如何实现这样的一个应用,还是会感觉无从下手.本文从简单的MNIST训练出 ...

  6. 实验5-9 使用函数输出水仙花数_正点原子STM32F407探索者开发板资料连载第五十三章 手写识别实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板 2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十三章 手写识别实 ...

  7. Qt虚拟键盘更新,支持手写识别功能

    Qt官方博客发布消息称,新版本的Qt虚拟键盘支持手书写识别功能(HWR).性能改进.Nuance T9书写一体化,并支持繁体中文! Qt虚拟键盘日前发布了新功能和版本控制方案的更新.作为最近的许可变更 ...

  8. application.properties 不识别_阿波罗 STM32F767 开发板资料连载第五十八章 手写识别实验

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第五十八章 手写识别实验 ...

  9. 【正点原子STM32连载】第五十四章 手写识别实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

    1)实验平台:正点原子MiniPro H750开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560 3)全套实验源码+手册+视频 ...

最新文章

  1. 动态创建DataTable[转]
  2. Mysql之增加数据_INSERT INTO
  3. 到底要不要考研?读完研究生就能找到好工作了吗?
  4. .Net5 WPF快速入门系列教程
  5. Hibernate自动提交命令强制MySQL在过多的磁盘I / O中运行
  6. 在生产服务器上要注意dbgsvc.exe
  7. 特斯拉推出通用钥匙带 官方售价145元
  8. c如何通过偏移量取出文件中的字节_理一理C语言字节对齐的那些事
  9. 【leetcode】535. Encode and Decode TinyURL
  10. C#与PLC通信开发之松下FP系列PLC
  11. 税控盘版增值税开票软件日志加密算法分析及解密工具
  12. 使用DFA算法模型构建敏感词过滤器
  13. libcurl 使用方法简介
  14. Java应用题:模拟一个简单的购房商贷月供计算器,按照以下公式计算总利息和每月还款金额,总利息=贷款金额*利率,贷款年限不同利率也不同,这里规定只有三种年限、利率,见表
  15. 世纪安图招募汉化志愿者
  16. ANSYS中Beam188\Beam189单元命令流提取最大应力
  17. VS2019安装教学
  18. 击碎瓶颈《华为项目管理体系最佳实践 》青岛站
  19. [聊聊] 【自制OTG数据线】好多人都花钱买了,有几个懂呢?
  20. CC1120 Sub-1G 无线射频收发器 驱动开发

热门文章

  1. 笔试真题解析分享|小红书3.26第三题解题思路
  2. 到主机的TCP/IP连接失败。
  3. 95和96码号位数可以延长吗?
  4. 进入游戏开发公司后的感想
  5. 求是量子产业观察:让量子计算机走出实验室,本源量子的成长之路
  6. 可变频率正弦信号发生器的FPGA实现(Quartus)
  7. 基于数字频率合成技术的正弦波发生器设计
  8. 以太坊go-ethereum客户端查询交易列表(二)
  9. 基于Psoc4 capsense的液位传感器的使用
  10. 一个跟STM32F0中断优先级有关的话题