2.1 软件编程导论
多点触摸输⼊编程和其他任何形式的编程⼀样,不过在多点触摸编程⾥,有⼀套⾃⼰的某些协议,⽅法和标准。通过NUI Group 与其他组织和社团的⼯作,多点触摸编程已经有了针对多种编程语⾔的开发框架, 这些语⾔包括ActionScript 3,Python,C,C++,C#以及Java。
多点触摸编程分为两步:⾸先,从摄像头或者其他输⼊设备读取和转化输⼊的触点信息,传递这些原始的触点信息通过之前制定的协议组合成⼿势,然后⾼级编程语⾔就可以使⽤⼿势来让⼀个应⽤程序配合。TUIO(Tangible UserInterface Protocol,可触摸的⽤户界⾯协议)已经成为追踪触点信息的⾏业标准协
议。
以下章节将讨论多点触摸软件的两个⽅⾯:触点追踪和应⽤程序运⾏框架。
2.2 触点追踪
对象追踪⼀直是计算机视觉基础研究领域的⼀个⽅⾯。它的⼯作是跟踪包括能够准确的反复识别包含特定对象的⼀系列视频帧(估算)。⼀般来说,这是⼀个⾮常困难的问题,因为⾸先要在所有的帧中发现对象(⽽且往往是在杂乱,封闭,或者是不断变换的照明条件下),以及让数据能够和帧之间以某种⽅式联系起来以便识别我们所需要的对象。
现在很多的问题已经被解决,在追踪这个问题上最普遍的模式就是“⽣成模式”(Generative Model),这是⼀些诸如Kalman 粒⼦过滤器等流⾏解决⽅案的基础。
在⼤多数的系统中,⼀个完善的背景相减算法需要对每帧进⾏预处理,这确保静态或者背景图像能够被忽略掉。对于⼀些光照不稳定的视频流,像“⾼斯混合模型”(Gaussian Mixture Model)这样的⾃适应模型已经能够⽐较智能的识别出不均匀的动态背景。
把背景过滤掉之后,剩下就是我们需要的前景对象了。我们往往确定这些对象的质⼼,⽽且这些点会被⼀帧⼀帧被追踪。追踪算法会根据这些萃取的质⼼估算在下⼀帧触点的位置。
稍稍说⼀下这个追踪,例如,⼀个基于Kalman 过滤器的简单模式可能是⼀个线性恒定速度模型。⼀个Kalman 过滤器有两个动⼒学⽅程,⼀个是STATE⽅程(“状态⽅程”),另⼀个是OBSERVATION ⽅程(“观察⽅程”),在这个例⼦中,
这套⽅程分别是
该状态⽅程描述了在有噪声的情况下状态变量‘xk’的变化情况。如果我们说‘xk-1’表⽰物体在‘k-1’时刻的真实位置,那么这个模型就可以基于⼀定的速度、‘Vuk’和噪⾳因素,根据线性组合的⽅式,推测出‘k’时刻物体的位置。到⽬前为⽌,根据这个模型,我们还不能直接的通过观察预测物体的位置Xk,我们需要观察⽅程。观察⽅程⽤来描述实际观察变量‘yk’,在这⾥,‘yk’被定义为真正位置‘xk’的⼀个噪⾳观察值。噪⾳的值也假定是均值为零的⾼斯⽩噪声。运⽤这两个⽅程,卡尔曼滤波器就能根据物体的上⼀个位置,通过递归的⽅式预测出物体的位置。
每个状态的预测,数据追踪模块都会去按照事先的预测和观测数据去追踪对象。如果没有找到符合预想的对象,那么这个对象就会被视为⼀个新的对象⽽被追踪。
2.2.1 多点触摸的追踪
追踪是多点触摸⾮常重要的技术。它允许多个⼿指同时进⾏控制。我们也可以识别出⼿势,因为每个⼿指的轨迹都可以被记录并输出。没有追踪技术,这是不可能的。
值得庆幸的是,今天的多点触摸硬件⼤⼤地简化了追踪对象的流程,因此,即使是最简单的Kalman 滤波器实际上也成为不必要的了。现在的追踪系统性能瓶颈趋向于怎么产⽣并维持⼀个背景模型。⼤量的计算会使CPU 严重超负,除⾮出现更加智能的⽅案。然⽽现在的基于红外线(IR)的硬件⽅案,⽐如FTIR 或DI,⾃适应背景模型(adaptive background model)会被扼杀掉。由于⾮红外光⼏乎都会被过滤掉,所以⼤部分的背景就被硬件给删除了。为了这些红外图像,捕捉⼀个静态的背景图往往会删除⼏乎所有的环境光。这个背景图像会减去其后所有的帧,剩下的这些帧将作为阈值应⽤给系统,然后我们就只剩下了那些突起的点,这些点也就是我们想要捕捉的⼿指或者表⾯对象,称之为“触点”。[译者注:这个可能⽐较难理解,我给⼤家举个例⼦吧,⽐如我们在PS 中的“阈值”命令,可以将灰度或彩⾊图像转换为⾼对⽐度的⿊⽩图像。“阈值”命令可以确定图像的最亮和最暗区域。想想我们的在CCV 或者tbeta 中看到的捕捉后的图像,不就是⿊⽩对⽐⾮常明显的图像么?背景是纯⿊,⼿指尖是纯⽩。]
此外,只要给出范围,那么追踪问题就⽐较简单了。我们知道,从⼀帧到下⼀帧,以标准的30Hz 计算的话为33ms,⼀个⼈的⼿指在这段时间⾥移动的距离⾮常有限。根据这种预测,我们不⽤研究物体的动⼒学,只需要找两帧之间最近的匹配物就是了。近邻⽐较的⽅式是⽐较相应的数据,⼀般是⽐较欧⼏⾥德⼏何距离。通过这种⽅式,⼀个数据点和⼀系列靠近它的‘k’点进⾏⽐较,得到该点的新位置。通过这种⽅式,我们可以⽐较可靠的追踪某个具体的触点。试误法是经常采⽤的⽅法,当情况不确定的时候,我们总是试探着处理这些情况,⽐如,当⼀个物体挡住另外⼀个物体的时候。
在Touchlib 和CCV 框架中都有追踪器的实例。使⽤OpenCV,⼀个开源的计算机视觉库,可以直接处理图像和视频流,能够⾮常准确地实时追踪到触点。当⼀个触点被发现,消失或者移动的时候,这些触点的相关信息(位置,ID,区域等)都会以事件的形式发送出去。开发者就可以利⽤这些信息去监听这些触点开发出应⽤程序。