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