Kinect2.0远程控制鼠标操作
马上要答辩了,写一下我编程序的思路,方便回顾一下。
刚接触Kinect的时候是在2个月前,老师给了2个项目,1个是基于Kinect的手势识别,另一个是基于Kinect的运动训练系统,假期的时候琢磨了一下,把手势识别做出来了。在查阅资料的时候发现有人利用Kinect将屏幕变成了触屏的,我对这个挺感兴趣的,于是就做了一个利用指尖取控制鼠标的程序。
刚开始有这个思路的时候上网查了很多资料,发现也有人做过类似的,找到了源码,发现有很多误差,并没有那么准确,于是自己去想了方法,想办法解决这些问题。
废话就说到这里,下面来具体说一下我的思路,如果有更好的想法的朋友,可以加我QQ 942880192 一起探讨一下。
环境配置:Kinect2.0 VS2017 Opencv3.2(没有opencv也行)
我的思路是,手指指到屏幕哪个地方,鼠标就相应的移动到哪个地方,通过一些Kinect中能识别的特定姿势,来判断是否开启鼠标,或者是否长按。而鼠标的单双击我则是通过鼠标停留在同一位置的时间长短来确定的。
1.确定指尖
我通过找到手部关节点的位置,以此位置画出一个大概的手部存在的区域,并在这个区域中寻找指尖的位置。
手指指尖的位置应该满足一下几点要求
(1)距离手关节点的长度最长(注意是3维的,算长度的时候不要忘记Z轴)
(2)深度最深
(3)属于人体
通过设计算法,我成功的找到了指尖的位置 如图
在实验的过程中发现,Kinect不能正对着太阳光,否则深度图会产生噪音,对指尖的识别影响极大。
2.确定屏幕的范围
由于我想要手指指到哪里,鼠标就到哪里,因此需要确定一下屏幕在哪里,并根据屏幕的大小制定一个操作窗口,通过坐标转换的方式去找到鼠标所在位置。
因为已经识别到了指尖的位置,因此我只需要用手指指到屏幕的左上角以及右下角,就能确定范围了。
3.鼠标抖动消除
由于Kinect并没有那么精准,因此需要做一下抖动消除,目的就是过滤掉那些误差较大的数据。
我直接记录上一次鼠标的位置去和当前鼠标位置作比较,如果相差的范围很小,那么不移动鼠标。
4.长按,单,双击
左手举起握拳,则进入到长按模式。左手举起握拳,举起--我通过获取左手手部Y坐标与肘部的Y坐标来判断是否举起。而判断握拳则直接使用了Kinect提供的提供的方法。单击和双击的实现,则通过计算鼠标在同一位置停留的时间来判断(双击的判断仍有一些问题)。
以上就是我的大概思路,如果有更好的想法的朋友,希望可以和我联系一下哦~