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

Kinect V2 で発話者を特定する


2016.07.18: created by
Japanese English
目次へ

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


発話者を特定する

setSkeleton()関数により骨格情報を得ることで人間の位置がわかります。 setSkeleton()関数の呼び出しの後で setAudio(true)関数を呼び出す(引数がtrueであることが重要)と 音声方向と人間の位置から発話者を特定します。

特定した発話者の skeletonTrackingId の値は audioTrackingId変数に保持されます (発話者不明の場合は負の値になります)。 audioTrackingId変数の値と skeletonTrackingId[index ] の値が一致していれば、 skeleton[index ] が発話している骨格であると判定できます。

NtKinect

NtKinect の骨格情報に関するメソッド

返り値の型 メソッド名 説明
void setSkeleton() 骨格認識を行い、次のメンバ変数に値を設定する。
変数名説明
vector<vector<Joint>> skeleton骨格情報
vector<int> skeletonId骨格の bodyIndex
vector<UINT64> skeletonTrackingId骨格のtrackingId
NtKinect

NtKinect の骨格情報に関するメンバ変数

変数名 説明
vector<vector<Joint>> skeleton 骨格情報のベクタ。 一人の人間の関節の集合が vector<Joint> であり、これが骨格情報です。 複数の人間を扱うため骨格情報のベクタ、すなわち vector<vector<Joint>> となります。
関節の座標は CameraSpace 座標系における位置です。
  • 認識した人数 --- sekeleton.size()
  • index 番目の人間の骨格情報 --- sekeleton[index ]
  • index 番目の人間の関節情報の数 --- sekeleton[index ].size()
  • index 番目の人間のjointType の関節の情報 --- sekeleton[index ][jointType ]
  • index 番目の人間のjointType の関節の座標 --- sekeleton[index ][jointType ].Position
  • index 番目の人間のjointType の関節の追跡状況 --- sekeleton[index ][jointType ].TrackingState
skelton[index ][jointType ].JointType == jointType が成り立ちますので、特定の骨格の特定の関節の情報に直接アクセスすることができます。
vector<int> skeletonId 骨格に対応するbodyIndexのベクタ。
skeleton[index ] の bodyIndex は skeletonId[index ] に保持されます。
vector<UINT64> skeletonTrackingId 骨格に対応するtrackingIdのベクタ。
skeleton[index ] の trackingId は skeletonTrackingId[index ] に保持されます。
NtKinect

NtKinect の音声に関するメソッド

返り値の型 メソッド名 説明
void setAudio(bool flag = false)

音声を取得し、録音中ならファイルに保存する。
音声の方向を判定し、変数 beamAngle にセットする。

引数
flag
setSkeleton()を呼び出した後で引数をtrueにして呼び出すと 発話者のskeletonTrackingId[i] をメンバ変数audioTrackingId にセットする。
void drawAudioDirection(cv::Mat& image ) 音声ビームの方向を image に描画する。
bool isOpenedAudio() 録音ファイルをopen中かどうかを返す。
void openAudio(string path ) path を録音用ファイルとしてオープンする。
void closeAudio() 録音用ファイルをクローズする。
NtKinect

NtKinect の音声に関するメンバ変数

変数名 説明
float beamAngle 音声の方向(左右への角度)
float beamAngleConfidence beamAngleの信頼度 (0.0 〜 1.0)
UINT64 audioTackingId 発話者のskeletonTrackingId

プログラム作成の手順

  1. NtKinect: Kinect V2 で音声方向を取得する。」 の Visual Studio のプロジェクト KinectV2_audio2.zipを用いて作成します。
  2. WaveFile.hは既にプロジェクトに追加されているはずです。

  3. main.cppの内容を以下のように変更します。
  4. NtKinect.hをincludeする前に USE_AUDIO 定数をdefineします。 setSkeleton()の後で setAudio(true)を呼び出すとアレイマイクにより音声の方向が計算され、 方向が一致する骨格情報の skeletonTrackingId が audioTrackingId に代入されます。

    main.cpp
    #include <iostream>
    #include <sstream>
    
    #define USE_AUDIO
    #include "NtKinect.h"
    
    using namespace std;
    
    void doJob() {
      NtKinect kinect;
      cv::Mat beam;
      while (1) {
        kinect.setRGB();
        kinect.setSkeleton();
        kinect.setAudio(true);
        for (int i=0; i<kinect.skeleton.size(); i++) {
          int w = 10;
          cv::Scalar color = cv::Scalar(0,0,255);
          if (kinect.audioTrackingId == kinect.skeletonTrackingId[i]) {
            w = 20;
            color = cv::Scalar(0,255,0);
          }
          for (auto joint: kinect.skeleton[i]) {
            if (joint.TrackingState == TrackingState_NotTracked) continue;
            ColorSpacePoint cp;
            kinect.coordinateMapper->MapCameraPointToColorSpace(joint.Position,&cp);
            cv::rectangle(kinect.rgbImage,cv::Rect((int)cp.X-w/2,(int)cp.Y-w/2,w,w),color, 2);
          }
        }
        cv::imshow("rgb", kinect.rgbImage);
        kinect.drawAudioDirection(beam);
        cv::imshow("beam", beam);
        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;
    }
    
  5. プログラムを実行するとRGB画像が表示されます。'q'キーで終了します。
  6. 関節が赤い四角形で描画されますが、発話者の関節は緑の四角形で描画されます。

    音声方向を別ウィンドウで表示しているのは確認のためだけで、この部分はなくても構いません。







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



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