NtKinect: Kinect V2 C++ Programming with OpenCV on Windows10

Kinect V2 で BodyIndex 画像を取得する


2016.07.20: created by
2016.07.21: revised by
Japanese English
目次へ

前提として理解しておくべき知識


BodyIndex画像

Depth画像と同じく 512x424 の解像度でBodyIndex画像を取得することができます。 同時に6人まで区別することができます。

NtKinect では得られたBodyIndex画像はピクセル毎に uchar または cv::Vector3b で表現されます。

NtKinect の BodyIndex 画像に関するメソッド

返り値の型 メソッド名 説明
void setBodyIndex(bool raw = true) メンバ変数 bodyIndexImage に BodyIndex 画像をセットする。
引数raw がtrue または 引数がない場合、各画素に bodyIndex の値が uchar 型でセットされる。
引数 raw がfalseの場合、bodyIndexを色に変換したデータ cv::Vec3b 型でセットされる。

NtKinect の BodyIndex 画像に関するメンバ変数

変数名 説明
cv::Mat bodyIndexImage BodyIndex画像。
6人まで同時検出が可能で、BodyIndex自体は検出された人ごとに割り当てられた 0〜5の番号である。 BodyIndex画像の各画素の型は uchar の場合と cv::Vec3b の場合がある。 画像の座標は DepthSpace 座標系における位置である。
  • bodyIndex.cols --- 画像の横方向の解像度 (512)
  • bodyIndex.rows --- 画像の縦方向の解像度 (424)
  • bodyIndex.channels() --- 画素がuchar型のとき 1 を, cv::Vec3bのとき 3 を返す。

画素がuchar型のとき

各画素の値は、人が検出された場合は 0〜5、検出されない場合は255になる。
  • bodyIndexImage.at<uchar>(y , x ) --- 画像の (x , y ) 座標の画素にアクセスする
  •     uchar pixel = bodyIndexImage.at<uchar>(y , x )
    

画素がcv::Vec3b 型のとき

bodyIndex画像は bodyIndex 番号に相当するRGBの値 cv::Vec3b で示される。
  • bodyIndexImage.at<cv::Vec3b>(y , x ) --- 画像の (x , y ) 座標の画素にアクセスする
  •     cv::Mat pixel = bodyIndexImage.at<cv::Vec3b>(y , x )
    
    bodyIndexcv::Vec3b
    025500  
    102550  
    200255  
    32552550  
    42550255  
    50255255  

プログラム作成の手順

  1. NtKinect: Kinect V2 でRGBカメラ画像を取得する(基本設定)」 の Visual Studio のプロジェクト KinectV2.zipを用いて作成します。
  2. main.cppの内容を以下のように変更します。
  3. kinect.setBodyIndex()メソッドを呼び出して kinect.bodyIndexImage に各画素毎の bodyIndexデータを設定します。

    main.cpp
    #include <iostream>
    #include <sstream>
    
    #include "NtKinect.h"
    
    using namespace std;
    
    void doJob() {
      NtKinect kinect;
      while (1) {
        kinect.setBodyIndex(false);
        cv::imshow("bodyIndex", kinect.bodyIndexImage);
        auto key = cv::waitKey(1);
        if (key == 'q') break;
      }
      cv::destroyAllWindows();
    }
    
    int main(int argc, char** argv) {
      try {
        doJob();
      } catch (exception &ex) {
        cout << ex.what() << endl;
        string s;
        cin >> s;
      }
      return 0;
    }
    
    
  4. プログラムを実行するとBodyIndex画像が表示されます。'q'キーで終了します。
  5. setBodyIndex() メソッドの呼び出しで引数にfalseを指定しているので、 得られるbodyIndex画像は各画素が cv::Vec3b 型の画像です。 この実行例では認識されている人がシアン(水色)で表現されているので、 その人の bodyIndex は3であることがわかります。




  6. サンプルのプロジェクトはこちら KinectV2_bodyIndex.zip
  7. 上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。



http://nw.tsuda.ac.jp/