Kinect for Windows SDK 2.0 では顔認識に関しては次のように定義されています。
Kinect for Windows SDK 2.0 の Kinect.Face.h(抜粋) |
---|
enum _FacePointType { FacePointType_None= -1, FacePointType_EyeLeft= 0, FacePointType_EyeRight= 1, FacePointType_Nose= 2, FacePointType_MouthCornerLeft= 3, FacePointType_MouthCornerRight= 4, FacePointType_Count= ( FacePointType_MouthCornerRight + 1 ) }; enum _FaceProperty { FaceProperty_Happy= 0, FaceProperty_Engaged= 1, FaceProperty_WearingGlasses= 2, FaceProperty_LeftEyeClosed= 3, FaceProperty_RightEyeClosed= 4, FaceProperty_MouthOpen= 5, FaceProperty_MouthMoved= 6, FaceProperty_LookingAway= 7, FaceProperty_Count= ( FaceProperty_LookingAway + 1 ) }; |
Kinect for Windows SDK 2.0 の Kinect.h(抜粋) |
---|
enum _DetectionResult { DetectionResult_Unknown= 0, DetectionResult_No= 1, DetectionResult_Maybe= 2, DetectionResult_Yes= 3 }; |
Kinect for Windows SDK 2.0 の Kinect.h(抜粋) |
---|
typedef struct _PointF { float X; float Y; } PointF; |
USE_FACE 定数を define してから NtKinect.h を include する と NtKinect の顔認識関係のメソッドや変数が有効になります。
setSkeleton() 関数を呼び出して 骨格情報を取得した後に、setFace()メソッドを呼び出して顔を認識することができます。
返り値の型 | メソッド名 | 説明 | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
void | setFace() | version1.2以前。 setSkeleton()を呼び出した後に呼び出して顔認識をすることができる。 次のメンバ変数に値が設定される。
|
|||||||||||||||
void | setFace(bool isColorSpace = true) | version1.3以降。 setSkeleton()を呼び出した後に呼び出して顔認識をすることができる。 次のメンバ変数に値が設定される。
第1引数をfalseで呼び出した場合はDepthSpace座標系における位置が変数にセットされる。 |
型 | 変数名 | 説明 |
---|---|---|
vector<vector<PointF>> | facePoint | 顔の部品の位置。 一人の人間の「左目、右目、鼻、口の左端、口の右端」の位置が vector<PointF> であり、 複数の人間を扱うため vector<vector<PointF>> となる。 (version1.2以前)ColorSpace 座標系における位置である。 (version1.3以降)ColorSpace座標系またはDepthSpace座標系における位置である。 |
vector<cv::Rect> | faceRect | 顔の矩形領域のベクタ。 (version 1.2以前)ColorSpace 座標系における位置である。 (version1.3以降)ColorSpace座標系またはDepthSpace座標系における位置である。 |
vector<cv::Vec3f> | faceDirection | 顔の向き (pitch, yaw, roll) のベクタ |
vector<vector<DetectionResult>> | faceProperty | 顔の状態。 一人の人間の「笑顔、正面、眼鏡、左目閉じる、右目閉じる、口が開く、口が動く、目をそらす」が vector<DetectionResult> であり、 複数の人間を扱うため vector<vector<DetectionResult>> となる。 |
vector<UINT64> | faceTrackingId |
version 1.4 以降で利用できる。 trackingIDのベクタ。 顔情報 faceRect[index ] などに対応する trackingIdは faceTrackingId[index ] です。 |
骨格認識されたすべての人間の顔が認識されるとは限りません。 「ある骨格が笑顔であるかどうか」など skeleton と face の対応を取りたい場合は、 skeletonTrackingId[i] と faceTrackingId[j] が一致するかどうかで判定できます(version1.4以降)。 version1.3以前のNtKinectをお使いの場合は、 骨格認識で得た顔の位置 kinect.skeleton[i][JointType_Head] が、顔認識で得られた顔の矩形領域 kinect.faceRect[j] の範囲内にあるかどうかで判定して下さい。
ソリューションエクスプローラのプロジェクト名の上で右クリックしてメニューからプロパティを選択します。
「構成プロパティ」の「リンカー」の「入力」の「追加の依存ファイル」を選択して、「編集」を選びます。
Kinect20.Face.libを追加します。
xcopy "$(KINECTSDK20_DIR)Redist\Face\x64" "$(OutDir)" /e /y /i /r
NtKinect.h をinclude するよりも前に USE_FACE 定数をdefineして下さい。
kinect.setSkeleton()メソッドを呼び出します。 プログラム例では kinect.skeleton を表示していますが、表示をする部分は省略しても構いません。 顔認識の前に kinect.setSkeleton()メソッドを呼び出して骨格認識をしておくことが重要です。
setFace()メソッドを呼び出します。 kinect.faceRect, kinect.facePoint, kinect.faceProperty, kinect.faceDirection の値が設定されるので 必要に応じて表示します。
main.cpp |
|
RGB画像の上に、認識された顔情報が表示されます。
この例では、顔の矩形領域をシアン色の四角形で表示し、 また顔の部品(左目、右目、鼻、口の左端、口の右端)の 位置に黄色の四角形を書いています。
上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。