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

Kinect V2 でDepth画像を取得する


2016.07.19: created by
Japanese English
目次へ

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


Depth画像

512x424の解像度でDepth(距離、深度)画像を取得することができます。 測定可能な距離の範囲は500mm 〜 8000mm ですが、 人間を認識できる範囲は 500mm 〜 4500mm の範囲です。

Kinect20.lib において IDepthFrameSource は get_DepthMinReliableDistance()メソッドと get_DepthMaxReliableDistance()メソッドを持っていますが、 それぞれが返す値は 4500 と 500 です。

NtKinect では得られたDepth画像はピクセル毎に UINT16 (16bit 符号なし整数) で表現されます。

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

返り値の型 メソッド名 説明
void setDepth(bool raw = true) メンバ変数 depthImage に Depth 画像をセットする。
引数が「なし」か「true」で呼び出された場合、各画素には距離がmm単位で設定される。
引数が「false」で呼び出された場合、各画素には距離を 65535/4500 倍した値が設定される。 すなわち 0〜4500 (mm) という距離を0 (黒) 〜 65535 (白) という白黒画像の輝度にマップした画像になる。

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

変数名 説明
cv::Mat depthImage Depth 画像。 512x424の大きさで、各ピクセルは UINT16 で表現される。
画像の座標は DepthSpace 座標系における位置となる。
  • depthImage.cols --- 画像の横方向の解像度 (512)
  • depthImage.rows --- 画像の縦方向の解像度 (424)
  • depthImage.at<UINT16>(y , x ) --- 画像の (x , y ) 座標の画素にアクセスする
  •         UINT16 depth = rgbImage.at<UINT16>(y , x );
    

プログラム作成の手順

  1. NtKinect: Kinect V2 でRGBカメラ画像を取得する(基本設定)」 の Visual Studio 2015 のプロジェクト KinectV2.zipを用いて作成します。
  2. main.cppの内容を以下のように変更します。
  3. kinect.setDepth()メソッドを呼び出して kinect.depthImage に距離データを設定します。 引数として false を指定しているので、距離データは 65535/4500 倍された値となります。

    最も近い 500mm は 7281 (11%、黒), 4500mm は 65535 (100%、白)の明るさで表現されることになります。

    main.cpp
    #include <iostream>
    #include <sstream>
    
    #include "NtKinect.h"
    
    using namespace std;
    
    void doJob() {
      NtKinect kinect;
      while (1) {
        kinect.setDepth(false);
        cv::imshow("depth", kinect.depthImage);
        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. プログラムを実行するとDepth画像が表示されます。'q'キーで終了します。
  5. setDepth()メソッドの呼び出しで引数にfalseを指定しているので、 ここで表示されているDepth画像は近い点(距離0m)を黒(0x0000)で、遠い点(距離 4.5m)を白(0xffff)で表した画像になります。




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



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