aihot  2017-04-28 13:30:46  OpenCV |   查看评论   

        一年多前开始接触计算机视觉这个领域的时候,年幼无知,倍感吃力。当年惶恐,从而盲从。挣扎了不少时日,感觉自己好像还是处于领域的门外汉一样,在理论与实践的鸿沟中无法挣脱,心里空落落的。在这种挥之不去的烦忧中,某个时候豁然开朗,觉得要看一个系统的了,看看别人是怎么写的,理论又是怎么用在实践上的。然后自己就瞄准了TLD这个被炒作地很火的跟踪算法。花了点时间做了详细的源码解读和注释。也发到了博客上,光荣的成为了我第一篇博客的主题。当年还年少气盛,欲借TLD与开源之力,顺势而为,扬言要捣腾一个人机交互系统出来,其中包括手势跟踪、TTS语音合成、语音识别、手势和语音控制鼠标和键盘等等。还naive到要移植到嵌入式设备上。不过,当年也的确开始了点工作,包括将TLD用以手势跟踪、鼠标控制、Ekho(余音)TTS语音合成和PocketSphinx语音识别等。后来因为语音识别效果不好,就卡住停滞不前了。

       这篇博文记录的其实和之前的将TLD用以手势跟踪有异曲同工之妙,哈哈。不同的点在于跟踪用的不是TLD了,而是简单的meanshift,当然了,我们也可以使用其他的目标跟踪算法,但这里需要实时的算法。例如我们之前分析的压缩跟踪CT算法,和时空上下文跟踪STC算法都是OK的。连我之前写的最简单的模板匹配和感知的跟踪都在这个平台上可以发挥光和热。但其实,真正的手势控制或者手势交互需要的跟踪算法要比这些要求高,它需要更准确和稳定的跟踪,还得抗干扰,克服复杂背景,光照等等。还有一点就是得避免跟踪框的抖动,否则鼠标也会跟着抖动,那多不爽啊。所以俺们的这个系统也是孤独下的催生物而已,也许没有太大的利用价值。哦,还有一点不同是,之前是在Linux平台下的,这次改在windows阵地,所以鼠标控制的接口就不同了。另外,本博文的代码比之前的要规范一点,需要替换跟踪器的时候,也可以较容易的替换。

       总的来说,这篇博文只是一个基于2D摄像头的粗糙的手势控制系统(不是一般的粗糙哦,哈哈),包括以下功能:

1)跟踪人手,然后映射到电脑的鼠标,也就是用人手取代鼠标去控制电脑光标(鼠标)的移动。

2)通过检测用户的握拳来模拟鼠标的左键点击功能,也就是我们用手控制鼠标移动到一个地方的时候,握拳,就相当于单击鼠标左键,也就是确定的功能了。

 

一、手势跟踪

       人手的跟踪我们采用的是简单的meanshift算法。因为人手是肤色的,所以如果背景是没有类肤色的东西的话,跟踪是很有效的。当然了,如果人手移动到人脸的地方,很大可能会影响跟踪结果。这是该算法的弱点之一。

1.1、meanshift跟踪

       meanshift均值漂移算法可谓是经典之经典。以至于在江湖上,视觉派和图像派的人如果不认得该秘笈,都不好意思出来混江湖了。对于这么经典的算法,江湖上的解说也一搜一大箩,大家也可以参考文献[2][3][4]。这里就简短介绍下算法主要思想和工作过程。

       meanshift算法本质上是最优化理论中的最速下降法。即沿着梯度下降方法寻找目标函数的极值。在跟踪中,就是为了寻找到相似度值最大的候选目标位置。meanshift方法沿着概率密度的梯度方向进行迭代移动,最终达到密度分布的最值位置。其迭代过程本质上是的最速下降法,下降方向为一阶梯度方向,步长为固定值。比较经典的meanshift算法的过程图示要数下面这个了:

       在d维空间中,任选一个点,然后以这个点为圆心,h为半径做一个高维球,因为有d维,d可能大于2,所以是高维球。落在这个球内的所有点和圆心都会产生一个向量,向量是以圆心为起点落在球内的点为终点。然后把这些向量都相加。相加的结果就是meanshift向量。如下图,其中黄色箭头就是meanshift向量。

基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)


       再以meanshift向量的终点为圆心,再做一个高维的球。如下图所以,重复以上步骤,就可得到一个meanshift向量。如此重复下去,meanshift算法可以收敛到概率密度最大得地方。也就是最稠密的地方。

基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)



      最终的结果如下:

基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)

 

       对meanshift的更多理解和推导请参考网络上的更多资料。下面我们分析下meanshift如何用在我们系统的手势跟踪过程中。我们要跟踪的是人手,而人手一般是比较统一的肤色,那么我们在图像中人手的这个区域统计每一种颜色的像素个数,这样我们会得到肤色的像素个数是最多的。然后对于新来的一帧图像,我们怎么找到手的位置呢?我们需要寻找满足人手肤色的地方。具体是通过用上面得到的直方图来计算整幅图像的反向投影。实际上就是一个肤色的概率图,图像中像素越像肤色,那该点属于肤色的概率就越大,在反向投影图中的值越大。例如:在整幅图中,假设某个像素的H分量值为10,然后我们到刚才从人手中统计得到的直方图中查找H=10对应的纵坐标值为50(代表搜索窗口中有50个H值为10的像素),则将整幅图中该像素的值置为50。对所有像素对应查找赋值便得到了反向投影图。可以理解为,它放映的是人手在图像中的位置的概率图(当然了,严格说不是这么理解的,这是像素级别和模板级别的差别)。概率图中值最大的地方也就是手的地方。然后我们通过meanshift算法来找到这个地方。

       我们的手势跟踪过程大概描述如下;

(1)初始化:我们检测到图像中人手区域后,统计得到该区域HSV颜色空间H分量的直方图。得到的直方图横坐标为0-255的灰度值(H分量的值),纵坐标为人手图像区域中某个H分量的值的像素个数。

(2)反向投影:利用(1)的直方图计算整幅图像的概率分布。实际计算中不必计算整幅图像,只需计算比搜索窗口大一些的范围。

 1/11    1 2 3 4 5 6 下一页 尾页
 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自基于meanshift的手势跟踪与电脑鼠标控制(手势交互系统)

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]