博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何写一个简单的手写识别算法?
阅读量:5818 次
发布时间:2019-06-18

本文共 3007 字,大约阅读时间需要 10 分钟。

 gesture recognizer 是比较好的解法。

洒家也有一个类似的算法,借鉴了原始手写ocr的思路来实现的。其实是写在 $1 gesture recognizer 之前的,但没有 $1 gesture recognizer 归纳得好,作者jacob还是我偶像。
把所有的笔画定义了个8个方向,然后将B的笔画可以分解成一个字符串。然后当人在触摸屏上画出一个符号时,也将它分解成8个方向的字符串,最后比较两个字符串的距离就能判断出和不同符号的近似度。
实现起来也很简单,第一步去噪,因为不同触摸屏的采样频率不同。
第二步把去噪后的数据转换成方向序列,把之前得到的点换成方向序列,并把方向序列归纳到之前定义的8个方向中去。
第三步把连续一致的方向合并。
第四步把小片段的移动略去,最后就能得出其实是画了一个凹的形状。
这个算法的厉害之处是可以实时识别,画到一半也能判断出来。
 源代码和demo都在上面了。
===============
吐槽时间。。。。
刚写完论文累死了,来吐槽。。。。
原来大家都觉得第一名不靠谱,怎么木有人把我顶上去!我眼红着那300多票呢!
我来告诉你为什么第一名不靠谱,
首先ocr拿来做gesture recognition是不对滴!
ocr是一个比gesture recognition更难的问题,因为ocr得到的是一张图片,所有点并没有时间戳,而手势识别时,每一下移动是有时间戳的,所以是知道“怎么画出来”这个额外信息的。
其次ocr不是这么解释的。
ocr问题的重点是怎么选择特征,比如知名的uci 数据集就有以下这些特征量:

1.	lettr	capital letter	(26 values from A to Z)     2.	x-box	horizontal position of box	(integer)     3.	y-box	vertical position of box	(integer)     4.	width	width of box			(integer)     5.	high 	height of box			(integer)     6.	onpix	total # on pixels		(integer)     7.	x-bar	mean x of on pixels in box	(integer)     8.	y-bar	mean y of on pixels in box	(integer)     9.	x2bar	mean x variance			(integer)    10.	y2bar	mean y variance			(integer)    11.	xybar	mean x y correlation		(integer)    12.	x2ybr	mean of x * x * y		(integer)    13.	xy2br	mean of x * y * y		(integer)    14.	x-ege	mean edge count left to right	(integer)    15.	xegvy	correlation of x-ege with y	(integer)    16.	y-ege	mean edge count bottom to top	(integer)    17.	yegvx	correlation of y-ege with x	(integer)

我不懂deep learning,别和我讲什么ocropus....

 

********************************************************************************************

 

移动设备多用手势进行输入,用户通过手指在屏幕上画出一个特定符号,计算机识别出来后给予响应的反应,要比让用户点击繁琐的按钮为直接和有趣,而如果为每种手势编写一段识别代码的话是件得不偿失的事情。如何设计一种通用的手势识别算法来完成上面的事情呢?

我们可以模仿笔记识别方法,实现一个简单的笔画识别模块,流程如下:

第一步:手势归一化

1. 手指按下时开始记录轨迹点,每划过一个新的点就记录到手势描述数组guesture中,直到手指离开屏幕。

2. 将gesture数组里每个点的x,y坐标最大值与最小值求出中上下左右的边缘,求出该手势路径点的覆盖面积。

3. 手势坐标归一化:以手势中心点为原点,将gesture里顶点归一化到-1<=x<=1, -1<=y<=1空间中。

4. 数组长度归一化:将手势路径按照长度均匀划分成32段,用共32个新顶点替换guestue里的老顶点。

第二步:手势相似度

1. 手势点乘:g1 * g2 = g1.x1*g2.x1 + g1.y1*g2.y1 + … + g1.x32*g2.x32 + g1.y32*g2.y32

2. 手势相似:相似度(g1, g2)=g1*g2/sqrt(g1*g1 + g2*g2)

由此我们可以根据两个手势的相似度算成一个分数score。用户输入了一个手势g,我们回合手势样本中的所有样本g1-gn打一次相似度分数,然后求出相似度最大的那个样本gm并且该分数大于某个特定阀值(比如0.8),即可以判断用户输入g相似于手势样本 gm !

--------------------------------------------------------------------------------------------------------------------------------------------

可以玩我5年前写的手势识别 Flash 游戏:

 

***************************************************************************************************************************************************

 

$1 Unistroke Recognizer,不用谢~代码非常简单,各种编程语言都有开源的库

我擦,排名第一的在说什么,我完全看不懂……

 

 

 

 

******************************************************************************************************************************

 

ioccc 2013 年的一段代码可以一战。

Adrian Cable - OCR in quick brown fox ASCII art
US

这段鬼畜的代码 () 可以做到识别手写的 ascii 字符,
识别不同的颜色,
兼容不同的尺寸,
识别一段代码,
排版字体,
以及一个笑脸 :)
执行效果:

 

references:

http://www.zhihu.com/question/29238666

 

转载于:https://www.cnblogs.com/foohack/p/4596987.html

你可能感兴趣的文章
SpringBoot 填坑 | CentOS7.4 环境下,MySQL5.7 表时间字段默认值设置失效
查看>>
iOS中的单例模式
查看>>
Android View 源码解析(二) - LayoutInflater
查看>>
centos7.4安装mongodb4.0.5若干问题及解决方案记录系列
查看>>
Java架构/如何判断一个元素在亿级数据中是否存在?
查看>>
比特币PHP离线交易开发包
查看>>
Qtum x86 虚拟机技术文档连载(三)
查看>>
基于Hexo搭建博客
查看>>
使用脚本在Linux服务器上自动安装Kubernetes的包管理器Helm
查看>>
Android 联系人列表功能及排序问题解决
查看>>
Autorelease 详解
查看>>
swift3 0 Alamofire的集成与封装
查看>>
一些不错的讲前端vue的网络上的视频
查看>>
LaTeX模板(一)
查看>>
那些年收藏的技术文章(二) 云笔记篇
查看>>
四. View的动画效果
查看>>
技术大牛之都在用的环境管理工具!
查看>>
rem计算推导
查看>>
iOS知识点大总结
查看>>
Go并发原理
查看>>