Leap motionカメラの情報に直接アクセスする方法が公式から公開されました.
https://github.com/leapmotion/leapuvc
地味に落とし穴があったのでサンプルを動かすまでの手順をまとめておきます.
動作環境
・Windows10 64bit
・Python 3.7.2
・OpenCV 3.4.4.19 (opencv-python)
・numpy 1.15.4
まず,上にあげたリンクからプロジェクト(leapuvc-master)ごとダウンロードしてきてください.
次にダウンロードしてきたleapuvc-master/LeapUVC Firmware Toolsを開きます.
Leapmotionをパソコンに繋げた状態で,leapuvc-master/LeapUVC Firmware Tools内のUnlockDevice.exeを実行します.
この画像のように動いて100%になったら成功(だいたい30秒ぐらい)

これでLeap motion側の準備は完了.
この後お好みのサンプルコードを実行すれば終了...のはずが色々なエラーと戦いましたw
ちなみに自分はpythonのサンプルで動作確認しました.
まず,これ
python cannot reshape array of size 460800 into shape (480,1280)
要するにカメラで取得したサイズとプログラムで指定されているサイズが違いますよ~~というエラー
原因は,参照しているカメラが違っていたこと.
leapuvc.py内でデフォルトのままだとカメラのデバイス番号として0が参照されている.自分のパソコンだとデバイス番号0はパソコンのインカメに対応するインデックスだったのでそこを変更.
この数字は,接続されているカメラの数によって変わってくるので適宜変更してください.
class leapImageThread(threading.Thread):
'''A dedicated thread that handles retrieving imagery from an unlocked Leap Motion Peripheral'''
# source の値をカメラに応じたインデックスに変更する
def __init__(self, source = 1, resolution = (640, 480), timeout=3.0):
'''Initialize Leap Image Capture'''
threading.Thread.__init__(self)
self.source = source
self.cam = cv2.VideoCapture(self.source)
self.cam.set(cv2.CAP_PROP_FRAME_WIDTH, resolution[0])
self.cam.set(cv2.CAP_PROP_FRAME_HEIGHT, resolution[1])
・・・・・・・
これで,leap motionのカメラを参照できたはずなので...再度実行
[ WARN:1] videoio(MSMF): OnReadSample() is called with error status: -1072875772 [ WARN:1] videoio(MSMF): async ReadSample() call is failed with error status: -1072875772 [ WARN:2] videoio(MSMF): can't grab frame. Error: -1072875772 [ WARN:2] videoio(MSMF): can't grab frame. Error: -2147483638
どうやらカメラの値を取得できていない様子...
この原因はLeapmotion Control Panelが動作していたためらしい
Leapmotion Control Panelを停止させて再度実行

無事動作しました.良かったw
白く光っているのはスマートフォンのライトです.LEDの追従とかは簡単に実装できそうです.
ちなみにこのプログラムはCameraControlExample.pyです.
Leapmotionがカメラとして動作しているかは,skypeなどのビデオ通話アプリからwebカメラの切り替えを行うことでも確認できます.

One thought on “Leap motion UVCのサンプルを動かすまで”