LeapMotion简单介绍及图形获取

      之前写过一篇文章关于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能够有效分析它视野中观察到的对象。它能够区分的 hands, fingers and tools ; 提供一系列 动作 和 位置 等信息; 它可以识别出四种特定的动作:  Circle,Swipe,Key Taps,Screen Taps ; 通过持续跟踪动作流,Leap Motion还可以将一个区域内的动作理解为三种基本元素: scaling, translation, and rotation 。 

Leap Motion手部图像获取

之前已经说过C#获取参数的问题,今天说一下怎么获取图像,这里要用到OpenCV(不了解的小伙伴可以评论里面问我,这次我就不详细说了,以后打算专门写一篇关于OpenCV的学习文章)
首先新建一个winform的程序,在页面上拖放两个pictureBox1,建议宽高设置为(640,240),因为leap的回传数据的分辨率就是这个,当然你想自己改也很简单。然后将OpenCV和Leap Motion的dll放进去,并引入。然后记得把你系统的目标平台选为你Leap Motion的dll的版本,不然运行会报错的(我就在这儿出了问题,这里我用的是64位的)
   


首先建立MyListener类,继承Listener,并且重新OnImages方法,然后重写一个委托,作为图片数据的回调

        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的包体太大所以只上传了代码,有问题或者想要直接运行的代码可以留言我会发给大家),有问题欢迎留言,或者私聊我

  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值