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

Kinect V2 でRGBカメラ画像を取得する(基本設定)


2016.07.13: created by
2017.08.30: revised by
2017.10.07: revised by
Japanese English
目次へ

前提条件

次のソフトウェアがインストールされていることを前提条件とします。インストールのパスが異なる場合は適宜読み替えて下さい。


以下の解説で 配布しているプロジェクトは、Visual Studio Community 2017 および OpenCV3.3を用いて作成されたものです。


NtKinectクラス: Kinect V2をC++ から簡単に利用するためのクラス

プログラム中で NtKinect クラスの変数を宣言すると Kinect V2 が初期化されて利用可能になります。

    #include "NtKinect.h"
    ...
    NtKinect kinect;     // 変数宣言

Kinect V2 の色々なセンサは、最初に利用したときに初期化されます。 たとえば RGB カメラは、最初に setRGB() メソッドを呼び出したタイミングで初期化されます。

    kinect.setRGB();    // RGB画像を取得する。最初の呼び出しでRGBカメラは初期化される。


Kinect V2 でRGBカメラ画像を取得する

Kinect V2 では 1920x1080 の解像度の RGB カメラ画像を取得できます。 OpenCVが BGR フォーマットまたは BGRA フォーマットを基本として用いていることから、 NtKinect では BGRAフォーマットを採用しています。

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

返り値の型 メソッド名 説明
void setRGB() RGB画像を取得し、publicなメンバ変数 rgbImage に設定する。

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

変数名 説明
cv::Mat rgbImage RGBカメラの画像。解像度は1920x1080でBGRAフォーマット。
画像の座標は ColorSpace 座標系における位置です。
  • rgbImage.cols --- 画像の横方向の解像度 (1920)
  • rgbImage.rows --- 画像の縦方向の解像度 (1080)
  • rgbImage.at<cv::Vec4b>(y , x ) --- 画像の (x , y ) 座標の画素にアクセスする
  •         cv::Vec4b pixel = rgbImage.at<cv::Vec4b>(y,x);
                piexel[0] // Blue
                piexel[1] // Green
                piexel[2] // Red
                piexel[3] // Alpha
    

プログラム作成の手順

  1. Visual Studio 2017 で新しいプロジェクトを開始します。
  2. [Visual Studio 2017 Update 2 より前の場合]
    1. 言語は"Visual C++"で、"Win32コンソール アプリケーション"を選択します。ここではプロジェクト名は"KinectV2"としています。



    2. Win32 アプリケーション ウィザードでは「次へ」を選択します。



    3. 「空のプロジェクト」にチェックを入れて「完了」を選択します。



    [Visual Studio 2017 Update 2 以降の場合]
    1. ファイル -> 新規作成 -> プロジェクト-> Visual C++ -> Windows デスクトップ -> Windows デスクトップウィザード を選択します。



    2. 名前はここでは KinectV2 とします。ソリューション名も自動的に KinectV2 となります。 "OK" を選択します。

    3. 「Windowsデスクトップ プロジェクト」で「アプリケーションの種類」を 「コンソール アプリケーション(.exe)」に, 追加のオプションの「空のプロジェクト」をチェックします。



  3. プロジェクトのターゲット アーキテクチャをx64に変更します。
  4. Visual Studio のウィドウ上部のメニューバーの中央付近に、コンパイルオプションを指定するウィンドウがありますので "x64" に変更します。また、実行が高速になるように "Debug" を "Release" に変更します。




  5. プロジェクトのソースファイルに main.cpp を追加します。
  6. C++のソースファイルが少くとも1個プロジェクト中に存在しないと、 プロジェクトのプロパティでC/C++という項目が選択できません。 そのため、まずここで main.cpp を追加します。










  7. プロジェクトのプロパティを設定します。
    1. 「ソリューションエクスプローラ」からプロジェクト名"KinectV2"を右クリックして「プロパティ」を選択します。



    2. 構成:「すべての構成」, プラットフォーム 「アクティブ(x64)」の状態で設定を行います。こうすることによってDebugおよびReleaseのどちらの設定ができます。もちろん、別々に設定しても構いません。
    3. 「構成プロパティ」の「C/C++」「全般」「追加のインクルード ディレクトリ」にKinectとOpenCVのパスを追加します。
    4.   $(KINECTSDK20_DIR)inc
        C:\opencv\include




    5. 「構成プロパティ」の「リンカー」「全般」「追加のライブラリ ディレクトリ」にKinectとOpenCVのパスを追加します。
    6.   $(KINECTSDK20_DIR)Lib/x64
        C:\opencv\lib




    7. 「構成プロパティ」の「リンカー」「入力」「追加の依存ファイル」にKinectとOpenCVのライブラリを追加します。
    8.   Kinect20.lib
        opencv_world330.lib




      [注意] もしもDebugモードでプログラムを実行する場合は、OpenCVのライブラリは opencv_world330d.lib をリンクしなくてはいけません。 そのためには、プロパティの設定で、構成を"Debugモード" を選択して 「追加の依存ファイル」に opencv_world330d.lib を指定します。

  8. (重要)プロジェクトのヘッダーファイルに NtKinect.h ( this site, github ) を追加します。
  9. 上記のリンクから NtKinect.h をダウンロードして下さい。ファイルの置き場所は main.cpp などのソースファイルが置かれているフォルダです。 この例だと KinectV2/KinectV2/NtKinect.h になります。







    もしも追加してもincludeできないというエラーが起きる場合は、追加したファイルを 一旦削除してから、「ソリューションエクスプトーラー」の「ヘッダーファイル」を右クリックして メニューの中から「追加」「新しい項目」「VisualC++のヘッダーファイル(.h)」で 「名前」に"NtKinect.h"を指定して下さい。 新たに作成されたファイルにダウンロードしたファイルの内容をコピーして下さい。

  10. main.cppの内容を以下のように変更します。
  11. 赤い文字の部分を書き替えることで、Kinect V2 のいろいろな機能を簡単に利用できます。

    main.cpp
    #include <iostream>
    #include <sstream>
    
    #include "NtKinect.h"
    
    using namespace std;
    
    void doJob() {
      NtKinect kinect;
      while (1) {
        kinect.setRGB();
        cv::imshow("rgb", kinect.rgbImage);
        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;
    }
    
    

    ちなみに、 cv:: が付いているのは OpenCV の関数です。

    返り値の型 OpenCV の関数名 説明 マニュアル
    void imshow(cost string& winname, const Mat& image ) imagewinname という名前のウィンドウに表示する。 link
    int waitKey(int delay =0) キーの入力をdelay ミリ秒待つ。0は無限を意味する。 link
  12. プログラムを実行するとRGB画像が表示されます。'q' キーで終了します。



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



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