如何实现移动设备的通用手势识别?

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

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

 

第一步:手势归一化

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 !

Loading

Posted in 人工智能, 编程技术 | Tagged | 4 Comments

使用 GlowFilter实现字体沟边与发光

如果你正在使用 Flash,那么实现下面一个字体效果是一件十分简单的事情:

image

textfield.filters = [ new GlowFilter(0, 1, 2, 2, 10) ];

这样就可以了,接着把字体设置成宋体12号,颜色是0xffff99,就成了。

image

如果要实现上面类似QQ面板的发光效果,也只需要一行:

textfield.filters = [ new GlowFilter(0xffffffff, 1, 6, 6, 0.9) ];

看起来这个 GlowFilter是无所不能呀,那么如果你在使用C++的话,如何用C++来实现一个Glow效果呢?

而且如果你正在使用3D引擎的话,如何用GPU来实现上面的效果呢?详细见下文:

Continue reading

Loading

Posted in 图形编程 | 5 Comments

快速可靠协议-KCP

KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,并以 callback的方式提供给 KCP。连时钟都需要外部传递进来,内部不会有任何一次系统调用。

整个协议只有 ikcp.h, ikcp.c两个源文件,可以方便的集成到用户自己的协议栈中。也许你实现了一个P2P,或者某个基于 UDP的协议,而缺乏一套完善的 ARQ可靠协议实现,那么简单的拷贝这两个文件到现有项目中,稍微编写两行代码,即可使用。

URL:https://github.com/skywind3000/kcp

Continue reading

Loading

Posted in 编程技术, 网络编程 | Tagged , | 21 Comments

TINY-GOBANG 最精简的五子棋人机对战

国庆没事,想看看最少多少行可以写一个人机对战起来游戏,于是有了这个 Python 版五子棋人机对战,仅仅几百行:

https://github.com/skywind3000/gobang

主要算法:min/max,博弈树搜索,alpha/beta 剪枝

下面是代码(点击 More/continue 展开)

Continue reading

Loading

Posted in 人工智能, 游戏开发 | Tagged | Leave a comment

《新水浒传》为维稳出了一份大力

中心思想就是两个字“忠义”,哪怕这个制度已经腐朽了,哪怕让自己和兄弟被害死,但仍要忠于皇上,这种“大忠大义”被导演讴歌的无处不在,大结还被局命名为“忠义参天”。

导演真是煞费苦心呀,为了表现宋江的英雄气概,强行加了很多原著上没有的台词,什么“犯我中华者虽远必诛”来突出他的气概,很多吴用说的经典台词也挪给宋江来突出他的智谋。让宋江这个机会主义者和投降主义者摇身一变成为一个忠义英雄,打着替天行道大旗骗民心,跟皇帝搞统一战线维稳,打农民起义军。

鲁迅说过:“一部《水浒》,说得很分明:因为不反对天子,所以大军一到,便受招安,替国家打别的强盗—不‘替天行道,的强盗去了。终于是奴才。”

宋江的问题不是他“是否英雄”,“是否有勇有谋”,而是他搞错了一个根本问题:就是“为谁而战?”,应该是为老百姓而战,而不是为皇帝而战。搞错了“替天行道”的这个天是谁这个基本道理,天应该是民意而不是封建统治阶级。他压根没搞明白“爱国”和“爱朝廷”是两码事。

毛主席说过:“《水浒》这部书,好就好在投降。做反面教材,使人民都知道投降派。《水浒》只反贪官,不反皇帝。”

导演一厢情愿的歪曲原著讴歌忠义,要替宋江平反不惜添油加醋,是导演想相谁献媚呢?还是想为为谁维稳?我觉得实在是该记导演一大功劳呀!!

Loading

Posted in 未分类 | 2 Comments

Windows字体为什么那么难看?

1)很多字库比如宋体,12号以下都是点阵字体。

2)GDI太老了,只有5级灰度,而且AA是横向的,Y轴方向没有AA。

3)雅黑又不能通用,且小字号时高低不平。

 

改进:

1)字体SuperSample。

2)勾边。

image_thumb8

image_thumb13

image_thumb15

image_thumb17

Loading

Posted in 图形编程, 编程技术 | 1 Comment

【原创】快速除以255的方法

经过若干次试验修改,研究出下面这个快速/255的宏,可以在 X属于[0,65536]的范围内误差为零:

#define div_255_fast(x)    (((x) + (((x) + 257) >> 8)) >> 8)

传统来说,人们习惯于将 /255改为 >> 8,但是这样误差挺大的,比如先乘以255再除以255,连续做十次,如果用>>8来代替除法,那么十次之后,误差为10. 另外一种常见的近似法是((x) + 255) >> 8,这种累积误差也挺厉害的。

因此>>8代替/255结果是比较粗糙的。而这个宏的开销比起>>8来说成本大12%。

经过测试65536000次计算中,使用/255的时间是325ms, 使用div_255_fast的时间是70ms,使用>>8的时间是62ms,div_255_fast的时间代价属于可以接受的范围。

下面是测试程序(点击more展开):

Continue reading

Loading

Posted in 编程技术 | Leave a comment

测试了一下:TT达到64

image

记录一下。

Loading

Posted in 未分类 | 4 Comments