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的包體太大所以只上傳了代碼,有問題或者想要直接運行的代碼可以留言我會發給大家),有問題歡迎留言,或者私聊我

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章