之前写过一篇文章关于C#简单调用LeapMotion的,然后前两天被工作组微信平台推送了一下,发现有同学对这个并不了解,所以今天先介绍一下Leap Motion是什么,然后说一下Leap Motion的一点开发内容。
Leap Motion简单介绍
相信很多人应该知道XBox吧,那有没有注意过XBox上的那个体感设备,那个是微软的kinect,而Leap Motion 也是做手势识别的,它只有一个口香糖大小,就可以监控你的手势,然后传给电脑进行处理。
Leap Motion 控制器不会替代您的键盘、鼠标、手写笔或触控板,相反,它与它们协同工作。当 Leap Motion 软件运行时,只需将它插入您的 Mac 或 PC 中,一切即准备就绪。只需挥动一只手指即可浏览网页、阅读文章、翻看照片,还有播放音乐。即使不使用任何画笔或笔刷,用您的指尖即可以绘画,涂鸦和设计。
用您的手指即可切水果、打坏蛋;用您的双手即可飙赛车。
您可以在3D空间进行雕刻、浇铸、拉伸、弯曲以及构建3D图像,还可以把他们拆开以及再次拼接。
体验一种全新的学习方式,用您的双手探索宇宙,触摸星星,还可以围绕太阳翱翔。。
一种全新的乐器体验,弹奏空气吉他、空气竖琴和空中的一切乐器,还可以体验全新的采摘和拾起方式。
您与电脑间的开阔空间,现已成为您双手和手指的舞台。不论它们的每一次移动多么细微,又或是多么大幅度,Leap Motion 控制器都能精确追踪。从技术上说,这是一个 8 立方英尺的可交互式 3D 空间。但您可以说,这就是魔法。
您的一只手,有 29 块骨头、29 个关节、123 根韧带、48 条神经和 30 条动脉。这是一种精密、复杂和令人惊叹的技术(x 2)。但您却能不费吹灰之力,轻松掌握。Leap Motion 控制器也几乎完全掌握这一技术。
Leap Motion 控制器可追踪全部 10 只手指,精度高达 1/100 毫米。它远比现有的运动控制技术更为精确。这就是您可以在一英尺宽的立方体中,绘制出迷你杰作的原因。
150°超宽幅的空间视场,您可以像您在真实世界一样随意在3D的空间移动您的双手。在 Leap Motion 应用中,您可以伸手抓住物体,移动它们,甚至可以更改您的视角。
Leap Motion 控制器以超过每秒 200 帧的速度追踪您的手部移动,这就是屏幕上的动作与您的每次移动完美同步的原因。
以上这些是百度百科给出的解释,说的简单一点就是可以不用键盘鼠标去控制电脑或者玩游戏。(感兴趣的同学可以从某宝上淘一个,买一百多那种就能用)下面是我的操作视频
Leap Motion是一种检测和跟踪hands, fingers and finger-like tools的设备。该设备在一个较近的环境中操作,精度高,跟踪帧速率高。
Leap Motion 视野是集中在设备上方的一个倒置的金字塔。Leap Motion检测的有效范围是约25毫米至600毫米(1英寸到2英尺)。
Leap Motion手部图像获取
public delegate void Receivedelegate(byte[] im1, byte[] im2);
/// <summary>
/// 图片委托
/// </summary>
public event Receivedelegate ReceiveEvent;
public override void OnImages(Controller arg0)
{
Frame frame = arg0.Frame();
ImageList images = frame.Images;
if (frame.Images.Count >= 2)
{
ReceiveEvent(images[0].Data, images[1].Data);
}
}
两个image数据分别是LeapMotion的两个摄像头的数据
然后是form后台:
private MyListener myListener;
private Controller leap;
public Form1()
{
InitializeComponent();
leap = new Controller();
myListener = new MyListener();
leap.AddListener(myListener);
leap.SetPolicy(Controller.PolicyFlag.POLICY_IMAGES);//启动图像的获取
myListener.ReceiveEvent += new MyListener.Receivedelegate(myListener_ReceiveEvent);
}
void myListener_ReceiveEvent(byte[] im1, byte[] im2)
{
Emgu.CV.Image<Emgu.CV.Structure.Gray, byte> im = new Image<Emgu.CV.Structure.Gray, byte>(640, 240);//640*240灰色图像,可以打断点发现数组im1长度正好为640*240
Emgu.CV.Image<Emgu.CV.Structure.Gray, byte> imtest = new Image<Emgu.CV.Structure.Gray, byte>(640, 240);//640*240灰色图像,可以打断点发现数组im1长度正好为640*240
im.Bytes = im1;
CvInvoke.Flip(im, imtest, Emgu.CV.CvEnum.FlipType.Horizontal);//图像水平翻转
pictureBox1.Image = imtest.Bitmap;
im.Bytes = im2;
CvInvoke.Flip(im, imtest, Emgu.CV.CvEnum.FlipType.Horizontal);//图像水平翻转
pictureBox2.Image = imtest.Bitmap;
}
今天事儿比较乱,写的不够详细,实际这快重点是OpenCV,代码我一样传到csdn上了,点击这里下载(因为OpenCV的包体太大所以只上传了代码,有问题或者想要直接运行的代码可以留言我会发给大家),有问题欢迎留言,或者私聊我