利用Kinect实现用指尖隔空控制鼠标(源码放出)
# 简介
此程序为利用Kinect实现用手指隔空控制鼠标,是我另一个项目的一部分,因为在另外那个项目中鼠标的click是通过一种特殊的方式实现的,因此这个程序**只实现了用手控制鼠标的移动,并没有点击的功能**。相比Leapmotion,利用Kinect来控制鼠标可以大幅增加操控范围,使用者可以随意走动,而不是被固定在桌面前。
好像很多人需要这个,但是网上为数不多的代码都是Kinect V1的,所以放出我的代码来供大家讨论。
源码
https://github.com/Beginner258/Kinect_Cursor_Control
运行环境
- Kinect for Windows V2
- Kinect SDK 2.0
- OpenCV 3.0
使用方法
首先需要让Kinect识别出你,建议距离0.5m以上4m以内并且正对摄像头,如果位置合适的话瞬间就能识别出,如果几秒钟都没有识别出来就请调节位置。然后将手放入操作窗口就可以控制鼠标了,绿色的点代表指尖。
效果

原理介绍
指尖识别基础
程序的核心在于指尖识别,我发现网上关于指尖识别的资料不多,所以自己想了个很简单的办法,不过效果还不错。首先应该知道三点:
1. Kinect可以分辨出画面中哪一部分是人体
2. Kinect带有深度摄像头,可以获取物体到摄像头的距离
3. Kinect可以获取到人体的最多25个关节点的位置
减小搜索空间
为了寻找指尖,没有必要在整副画面中去搜索,那样会导致效率非常低。指尖肯定是在手部关节点(Hand)附近的,因此只需要获取到手部关节点的位置然后再拓展出一片区域,在这片区域里进行搜索就行了。之所以取Hand而不是取HandTip,是因为后者的稳定性非常差,即使在一个合适的距离正对Kinect也不一定能识别出来。
指尖识别
这时候就可以根据指尖的特征来进行指尖识别了。不过实际上我识别出的不是指尖,而是指尖上方的一点。此点的特征如下:
- 不属于人体
- 或者属于人体,但是和手部关节点不在同一个平面上(允许有误差)
- 到手部关节点的位置在某个合适的范围内
- 下面连续N(这里我取N为5)个像素都属于人体
首先,对于第一点很好理解,因为上面说了识别的不是指尖,而是指尖上方的一点。
第二点是用来处理手移动到身边正前方的时候的情况,比如手在胸前,这时候指尖上方的点都是属于人体的,不满足第一点。这里的误差指的是手和小臂成90度时的深度差,一般15cm左右。
第三点是为了消除两根手指根部之间的那个位置形成的误判,同时也进一步减小了搜索空间,正常情况下手指到手腕的距离都在10~25cm范围内,这里把拇指筛掉了,一般也不会用拇指去操作。如果要恢复拇指的话调整下参数就可以。
第四个条件筛选出了离手指尖最近的那个点。
确定操作窗口
为了便于操作和观察,我设置了一个操作窗口,位于肩部的左上方和右上方,根据操作手的左右而调整。这个窗口就代表着电脑的屏幕,手指在窗口里的位置就是鼠标在电脑屏幕上的位置。这里窗口的大小是根据关节点Head到Neck的距离作为单位长度算出来的,也就是说能根据人体到Kinect的距离来调整操作窗口的大小。同时这个窗口是实时更新的,会根据人体的位置而进行调整。
这里要说一下,如果操作的位置相对固定,那么建议识别出窗口后就不要再更新,将操作窗口固定,因为这样能够大幅度提高鼠标的稳定性,同时上传了一份以这种方式来做的代码,不过这份代码只实现了单手控制。
抖动消除
这是个不太好处理的问题,因为容易影响到正常操作。这里我设置了一个移动的阈值,如果和上一个位置相比,鼠标的位置改变很微小,那么就保持上次的位置不变。还可以再加入一个判断位置突变的阈值,如果当前位置和上一次位置相距太远,就可以判断为非法而筛去。
指尖位置与鼠标位置的转换
黑色框为程序里确定的操作窗口,大写的X和Y代表的是屏幕的宽和高,红色框为电脑屏幕,假设人的手指在
的位置,如果想将鼠标也映射到同样的位置,那么就有
的等比关系成立。电脑屏幕的宽和高,实际上是不需要考虑分辨率的,因为在鼠标的坐标系下,电脑的宽和高都被分成了65535个单位,所以宽和高可以视为65535。根据这些,就可以算出
的值来。
利用Kinect实现用指尖隔空控制鼠标(源码放出)的更多相关文章
- Kinect v2控制鼠标原理分析和源码
https://blog.csdn.net/baolinq/article/details/54381284 此程序为利用Kinect v2实现用手指隔空控制鼠标,是我另一个项目的一部分,因为在另外那 ...
- 利用基于@AspectJ的AOP实现权限控制
一. AOP与@AspectJ AOP 是 Aspect Oriented Programming 的缩写,意思是面向方面的编程.我们在系统开发中可以提取出很多共性的东西作为一个 Aspect,可以理 ...
- Azure Terraform(九)利用 Azure DevOps Pipeline 的审批来控制流程发布
一,引言 Azure Pipeline 管道是一个自动化过程:但是往往我们由于某种原因,需要在多个阶段之前获得批准之后再继续下一步流程,所以我们可以向Azure Pipeline 管道添加审批!批准流 ...
- java通过控制鼠标实现屏幕广播
在java实现屏幕共享的小程序中提到截取屏幕时是没鼠标,为了看到教师端界面上的鼠标,可以在截取屏幕的时候,把鼠标绘制到每一张截图上去,但是由于截图的时候是一张张截取的,所以看到的鼠标难免会有点卡,之前 ...
- 反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) C#中缓存的使用 C#操作redis WPF 控件库——可拖动选项卡的TabControl 【Bootstrap系列】详解Bootstrap-table AutoFac event 和delegate的分别 常见的异步方式async 和 await C# Task用法 c#源码的执行过程
反爬虫:利用ASP.NET MVC的Filter和缓存(入坑出坑) 背景介绍: 为了平衡社区成员的贡献和索取,一起帮引入了帮帮币.当用户积分(帮帮点)达到一定数额之后,就会“掉落”一定数量的“帮帮 ...
- 控制窗口不能拖拉出主窗口 Dialog And Window
/* 控制窗口不能拖拉出主窗口(覆写) */var easyuiPanelOnMove = function(left, top) { if ($(this).panel('options').reS ...
- esriControlsMousePointer 控制鼠标指针
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass; 控制鼠标指针选项. 不变 值 描述 esriPo ...
- CSS控制鼠标滑过时的效果
用css控制鼠标样式的语法如下:<span style="cursor:*">文本或其它页面元素</span>把 * 换成如下15个效果的一种: 下面是对这 ...
- VBS控制鼠标移动和点击(附源代码下载)
森思:想用vbs来控制鼠标的移动和点击,虽然按键精灵可以做到,但做这么简单的事情不想启动那么大一个程序,所以自己用VC写了一个小程序,可以让VBS来控制鼠标移动和点击. 用法: 移动鼠标到桌面坐标20 ...
随机推荐
- Android应用耗电量统计,无需USB连接
Android应用耗电量统计一直是一个很头疼的问题,手工统计耗时太长,自动化统计又不是非常精准(执行自动化代码需要通过USB连接,而USB又会充电,这就造成统计数据不准).后来从前辈那里得知可以通过a ...
- Linux网络配置和网络诊断命令介绍
方法/步骤 1 在接下来的讲解中,讲解的Linux网络配置和网络诊断的命令有: ifconfig.ping.netstat.traceroute.dig和nslookup.host.hostname. ...
- Oracle EBS AP 供应商API
--创建供应商地址上的电话号码 created by jenrry 20170419 DECLARE l_return_status VARCHAR2(1); l_msg_count NUMBER; ...
- cookie 组成结构
1.用抓包工具 fidller 只能看到 cookie 的 name 和 value 两个参数,实际上 cookie 还有其 它参数 2.以下是一个完整的 cookie 组成结构 cookie ={u ...
- 【转】MaBatis学习---源码分析MyBatis缓存原理
[原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...
- Tidb进行缩减扩容tikv节点
这两天接到任务说是要进行测试缩减机器给集群带来的负面效果有哪些. 然后我就按照官方的教程将机器进行了缩减,主要是缩减tikv节点 我们先来看看官方的文章是怎么写的: 步骤都没有什么问题,就是进行到第二 ...
- It was not possible to find any compatible framework version
It was not possible to find any compatible framework version The specified framework 'Microsoft.NETC ...
- 让sublime text3支持Vue语法高亮显示[转]
1.准备语法高亮插件vue-syntax-highlight. 下载地址:https://github.com/vuejs/vue-syntax-highlight 下载页面并下载: 解开压缩包vue ...
- Codeforces Round #503 Div. 2
时间相对来说还是比较合适的,正好放假就可以打一打啦. A. New Building for SIS:http://codeforces.com/contest/1020/problem/A 题意概述 ...
- Scala学习之路 (五)Scala的关键字Lazy
Scala中使用关键字lazy来定义惰性变量,实现延迟加载(懒加载). 惰性变量只能是不可变变量,并且只有在调用惰性变量时,才会去实例化这个变量. 在Java中,要实现延迟加载(懒加载),需要自己手动 ...