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

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

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

 

第一步:手势归一化

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

About skywind

Putty 本无树,MinGW 亦非台
This entry was posted in 人工智能, 编程技术 and tagged . Bookmark the permalink.

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

  1. brent says:

    大神你好.

  2. brent says:

    大神你好..

  3. roc says:

    第一眼觉得这个公式好神奇。看到sqrt这个地方的时候就知道原理了
    可以这么解释:
    两个手势其实是两个多维向量
    v1 = (k1,k2,k3,k4,…kn)
    v2 = (q1,q2,q3,q4,…qn)
    两个向量是否相近,直接计算这两个向量的夹角

    这个算法在新闻匹配里用得很多的。

  4. skywind says:

    方法有很多,矢量夹角,矢量距离,都可以。就是求个矢量相似度而已。还可以做点乘。没必要拘泥

Leave a Reply

Your email address will not be published. Required fields are marked *