kinectでスライド送り
やりたいこと
やり方の概要
認識したらキー入力をプレゼンテーションアプリに送る。
使ったもの
ハードウェア
・kinect(v1)
・PC(windows10)
・ディスプレイ
ソフトウェア
・Visual studio(C#で書きました)
https://www.microsoft.com/en-us/download/details.aspx?id=40278
アルゴリズム概要
アプリを起動しウィンドウを開くイベントがあったら
各種変数を初期化し、キネクトを起動する
キネクトが骨格情報を取得したイベントがあったら
手首と肩の位置(X座標)を配列に10フレーム分記録する(キネクトは30fps)
手首と肩の相対位置(のX成分)も同様に記録する
相対位置の配列の最初と最後でX成分の符号が異なれば動作があったと判定
最初と最後の相対位置の差がしきい値以上で負なら右から左へのスワイプと判定
スワイプと判定したら、左へのスワイプならキーボードの下矢印キーを
右へのスワイプならキーボードの上矢印キーを、アクティブになっているアプリケーションに送る
キーを送ったら1秒間は動作を停止する
わかったこと
・関節の位置を使えば結構なジェスチャーは表現できそう
ユーザーに予め約束したジェスチャーをしてもらう分にはこれ以上の機械学習などは不要。
ユーザーが無意識に出す動作を拾うのは、難しいかも。
予め動作の特徴がわからなければ難しい。
この点は機械学習で克服の可能性あり。
課題
・キネクトは骨格しかわからず、例えば手の指関節はわからない。
やろうと思ったら自分で認識のためのコードがいる。
測距のアルゴリズム的に、指の影が見えてしまうので誤検知がありそう。
最近のデプスカメラはハンドトラッキングがデフォルトで提供されてる。
例えば https://www.moguravr.com/leap-motion-2/
MSも開発中らしい。
・コードが汚い。
C#に不慣れすぎる
forループがすごくネストしていて美しくない。
4種類のジェスチャーを統一したコードでかけるはず。
・不感時間が長い
不感時間をゼロにすると不安定になる。(一回のジェスチャーで複数回キー入力が送られる等)
安全みて1秒にしているけど、もっと短くできないものか
スライド送るときは大量に送りたいこともあるだろう。
・しきい値等のパラメータ調整が必要
自分でテストしながら調整した。
他人のスワイプとは少し違う可能性がある。
ただ、ここも敏感すぎず鈍感すぎない絶妙な値にしなくてはならない。
コードを直さなくてもアプリ上で設定できるようにすればマシかもしれない。
コード
signage_control/signage_ctrl at develop · nagiton/signage_control · GitHub