なるように、なる

徒然なつぶやき、備忘録です。

セグメンテーション

R200はセグメンテーション機能が使えないので、depthを使って自分で実装することにしました。

自力でセグメンテーション

  1. カラー画像とDepth画像を取得する
  2. Depth画像をカラー座標系に座標変換する
  3. パーソントラッキング機能で、カラー画像から人物の中心位置を取得する
  4. 人物の中心位置のdepthをもとに、前後50cm以外の箇所をカラー画像から取り除く

f:id:Shampagne:20170622060833p:plain

ざっくりですが、こんな感じになりました。
エッジ部分があらい、ブロブの内部も除去されてる、遅い。このあたりを改善したいです。

座標変換

カラー画像とDepth画像はカメラの位置がずれてるので、併せて使う場合は座標変換をする必要があります。今回はDepth画像の座標系をカラー画像に変換しました。
座標変換用のクラス「PXCProjection」を使います。
使い方は、こちらのサイトが参考になりました。
あと、RSDKのサンプルにある「Projection」も参考になります。

開発しますとどん

マラソンやらマストドンやらで、全く進捗のあがらない一週間でした。

これはいけない。心機一転、今日から作業再開します。

そのために、直近の「やること」と「やらないこと」を決めた。

もちろん、重要なのは「やらないこと」のほうだ。

時間は有限。大切にしなきゃですね。

小田原から大手町まで走った

HOTHOT2017

小田原から大手町まで走る大会に参加しました。

4月の上旬にふくらはぎを痛めたため、4月まつに15キロくらい走った以外はまったく練習せず、ぶっつけ本番で初ウルトラでした。

制限時間が緩かったので、完走できればいいや、という思いでしたが、それが功を奏して、無事にゴールまで完踏できました(がんばりすぎるとへばっちゃうからね)。

途中はほとんど歩きながらマストドンしてるだけの区間もあったけど、マストドンなかったら走るのやめてたようなような気もします。二コってくれてた人、ありがと。

 

数字の記録

走行距離:87km

走行時間:13時間46分48秒

体重:+0.3kg (翌日調べ)

体脂肪率:-3.5% (翌日調べ)

TOOT:36

 

使えるだけ使う

R200で使える機能を動かしてみたよ。
RSSDKのサンプルコードとドキュメント見ながら実装してみました。

Face
ちゃんと認識してくれていますね。
詰まったのは、「PXCFaceConfiguration::SetTrackingMode()」がエラーになること。「FACE_MODE_COLOR_PLUS_DEPTH」か「FACE_MODE_COLOR」が設定できるはずなんだけど、どちらを指定してもエラーになる。結局スキップしてるんですが、設定しなくても認識してくれています。

f:id:Shampagne:20170601230132p:plain

長男のハルキチに協力してもらいました。

PersonTracking
こちらもばっちりでした。
ただ、残念ながら「QuerySkeletonJoints()」で取得できると思っていた関節位置は、joints num =0となってしまい、R200では取れないようでした。
関節位置は欲しいので、今後OpenPoseを使ってみようと思います。

f:id:Shampagne:20170601230152p:plain



Blob
これは妻(顔出しNG)に手を広げもらっている様子です。
まぁ輪郭は取れているんですが、RSSDKのサンプルと比べると、いまいち精度が悪い。パラメータの調整が必要なのかもしれません。

f:id:Shampagne:20170601230210p:plain


3つの機能を動かしてみましたが、いずれの機能もAPIの呼び方はほぼ一緒なので、すぐに実装できます。「ほぼ」ってところが、若干残念で、「そこ関数名合わせようよ!」みたいのもありましたが。

次は背景の除去です。

どうしようかな~~

 

R200で使える機能

次は手指、、、

参考書に沿ってR200の機能確認を進める予定でした。
次は手・指の予定でした。

ある程度予想はしていたのですが、フロントカメラで動作する機能がR200では使えないものが多くあるようです。手・指の検出機能も、PXCSenseManager::EnableHand()のあとにPXCSenseManager::Init()を実行するとエラーが発生してしまいます。

 

全部試してみる

なら、どの機能が使えるのか、EnableXxx()を全部実行してみました。
結果はこちら。

Enable3DScan() ... Success.
Enable3DSeg() ... Failed.
EnableBlob() ... Success.
EnableEnhancedVideo() ... Success.
EnableFace() ... Success.
EnableHand() ... Failed.
EnableHandCursor() ... Failed.
EnableObjectRecognition() ... Success.
EnablePersonTracking() ... Success.
EnableScenePerception() ... Success.
EnableTouchlessController() ... Failed.
EnableTracker() ... Failed.

 

さて、

ということで、参考書に沿って進める計画は頓挫。
元々の目的に立ち戻って考えると、顔認識(Face)と人物認識(PersonTracking)あたりを深堀りしていくのが良さそう。
顔・体・手を認識する、背景を除去した動画像を作る、これをさっさとやる。

R200で画像を取得

ようやく開発環境が整ったので、R200でどんなことが出来るか試していきます。
当面は参考書のサンプルコードを順次試してみます。

今日はChapter 4-1~4-4で、カラー画像、Depth画像、IR画像の取得と、画像フォーマット一覧の取得です。

      1. カラー画像

        f:id:Shampagne:20170519005522p:plain

        これはサンプルコードそのままでOKでした。
        ヨガの練習後に半裸のままブログを書いているので、代わりに熊くんに写ってもらいました。この子の名前は「茶豆」です。よろしくね。

      2. Depth画像

        f:id:Shampagne:20170519005542p:plain

        これはサンプルコードに手を加える必要がありました。
        サンプルでは画像サイズを640x480としているのですが、これだとInit()でエラーになりました。あとで一覧の取得結果を載せますが、R200は640x480は未対応です。上記の画像は320x240にして取得しました。

      3. IR画像

        f:id:Shampagne:20170519005556p:plain

        これもDepth画像と同じく画像サイズを320x240に変更する必要がありました。
        加えて、EnableStream()の引数はSTREAM_TYPE_LEFTもしくはSTREAM_TYPE_RIGHTに変更します。サンプルで指定しているSTREAM_TYPE_IRは、R200では使えないです。
        IR画像なので、半裸の感じがはっきり分かりますね。

      4. 画像フォーマット一覧
         Intel(R) RealSense(TM) Depth Camera Manager R200
          Intel(R) RealSense(TM) 3D Camera R200
          Color
           YUY2 1920x1080x30
           YUY2 1920x1080x15
           YUY2 640x480x60
           YUY2 640x480x30
           YUY2 640x480x15
           RGB32 1920x1080x30
           RGB32 1920x1080x15
           RGB32 640x480x60
           RGB32 640x480x30
           RGB32 640x480x15
           RGB32 1920x1080x30
           RGB32 1920x1080x15
           RGB32 1280x720x30
           RGB32 1280x720x15
           RGB32 640x480x60
           RGB32 640x480x30
            RGB32 640x480x15
            RGB32 320x240x60
            RGB32 320x240x30
            RGB32 320x240x15

          Depth
           DEPTH 628x468x90
            DEPTH 628x468x60
            DEPTH 628x468x30
            DEPTH 480x360x90
            DEPTH 480x360x60
            DEPTH 480x360x30
            DEPTH 320x240x90
            DEPTH 320x240x60
            DEPTH 320x240x30

          Left
            Y16 628x468x60
            Y16 628x468x30
            Y8 480x360x60
            Y8 480x360x30
            Y16 480x360x60
            Y16 480x360x30
            Y16 320x240x60
            Y16 320x240x30

          Right
            Y16 628x468x60
            Y16 628x468x30
            Y8 480x360x60
            Y8 480x360x30
            Y16 480x360x60
            Y16 480x360x30
            Y16 320x240x60
            Y16 320x240x30

        これは、サンプルコードをそのまま実行すると、SenseManager::Init()でエラー終了してしまいます。Init不要では?と思い、コメントアウトしたところ、無事に上記の一覧を取得できました。
      では、今日はここまで。