徒然なる日々を送るソフトウェアデベロッパーの記録(2)

技術上思ったことや感じたことを気ままに記録していくブログです。さくらから移設しました。

今更 RealSense のコードを書いてみた

しばらく RealSense の SDK が更新されなかったし、デバイスの話題も
なかったので収束かな?と思っていたが、R5 が出ていました。と同時に
SR300 カメラの発表も。まだインテルさんやる気なようでよかったです。

で、本題ですが、まだ R4 で書いたコードを備忘録して記録していきます。
使用した言語は C# です。

必要なライブラリ

Program Files(x86) → Intel → RSSDK → bin → x64 → libpxcclr.cs.dll
注意点は x86 フォルダに x64 ライブラリが入っていることと、ターゲットを x64
変えておくこと。

もう1つ C++ のライブラリ libpxccpp2c.dll も必要だが COM ではないために
C# から指定するとエラーになるため、ビルド後の動作コマンドとして以下を記述する。

copy /y "$(RSSDK)bin/x64/libpxccpp2c.dll" "$(TargetDir)"

環境変数 RSSDK には最後バックスラッシュが含まれることに注意。

デバイスの初期化
  • gSess = PXCMSession.CreateInstance() でセッションを作成
  • cm = gSess.CreateSenseManager() で Sense Manager を作成
  • cm.EnableStream(...) で DEPTH, COLOR などの画像取得を指示
  • cm.EnableHand() で手認識を有効化
  • cm.EnableFace() で顔認識を有効化
  • cm.Init() で Sense Manager を初期化
  • 有効化した認識モジュールに対して設定と結果インスタンスを取得します。
  • 例: 顔検出の場合: fd = cm.QueryFace() として
  • cfg = fd.CreateActiveConfiguration() として
  • cfg.detection.isEnabled = true, cfg.landmarks.isEnabled = true
  • 上記は顔検出および特徴点抽出を有効化します。
  • 設定を反映させるため、cfg.ApplyChanges() を呼び出す。
  • 結果インスタンスは faceOutput = fd.CreateOutput() で取得します。
  • 最後に configuration を解放します。: cfg.Dispose()
メインループ

メインループは別 Task に切り出して処理させるのがお勧めのようです。

  1. フレームが有効になるのを待つ: cm.AquireFrame(true)
  2. キャプチャする: sample = cm.QuerySample()
  3. イメージデータを取得する: sample.xxx.AquireAccess(..., out imageData)
  4. 取得したイメージデータまたはビットマップを画面に張り付ける
  5. 検出器を使っている場合は状態を更新する: fd.Update()
  6. 検出器の出力を取得する。
  7. 顔検出器なら fd.QueryNumberOfDetectedFaces() で検出した顔数など。
  8. ループの最後にウェイトを入れる: Thread.Sleep(20) など。
終了処理
  • fd.Dispose() で fd を解放する

なお、取得した顔画像を Panel 等に張り付ける場合、単に Invalidate() した
だけでは背景が一々描画されるので見づらくなってしまいます。
これを避けるためには MyPanel という Panel の継承クラスを作成し、
コンストラクタ内で
this.SetStyle(System.Windows.Forms.ControlStyles.UserPaint
| System.Windows.Form.ControlStyles.AllPaintingInWmPaint
| System.Windows.Form.ControlStyles.OptimizedDoubleBuffer,
true);
として MyPanel を配置して下さい。

感想

顔認識は文句なく素晴らしい。口や目の動きが追跡できるので、口を開いたときに
アクションを起こす操作が書ける。
手の認識率はいまいち。右手の方が左手よりも認識率が高い。
パーの状態は認識率が高いが、手首を回すと人差し指と中指を間違えて認識する
ことがある。