Kinect V2 では 1920x1080 の解像度の RGB カメラ画像を取得できます。 OpenCVが GBR フォーマットを基本として用いていることから、 NtKinect でもGBRAフォーマットを採用しています。
返り値の型 | メソッド名 | 説明 |
---|---|---|
void | setRGB() | RGB画像を取得し、publicなメンバ変数 rgbImage に設定する。 |
型 | 変数名 | 説明 |
---|---|---|
cv::Mat | rgbImage | RGBカメラの画像。解像度は1920x1080でBGRAフォーマット。 画像の座標は ColorSpace 座標系における位置です。
cv::Vec4b pixel = rgbImage.at<cv::Vec4b>(y,x); piexel[0] // Blue piexel[1] // Green piexel[2] // Red piexel[3] // Alpha |
512x424の解像度でDepth(距離、深度)画像を取得することができます。 測定可能な距離の範囲は 500mm 〜 8000mm ですが、 人間を認識できる範囲は 500mm 〜 4500mm です。
Kinect20.lib において IDepthFrameSource は get_DepthMinReliableDistance()メソッドと get_DepthMaxReliableDistance()メソッドを持っていますが、 それぞれが返す値は 500 と 4500 です。
得られたDepth画像はピクセル毎に UINT16 (16bit 符号なし整数) で表現されます。
返り値の型 | メソッド名 | 説明 |
---|---|---|
void | setDepth(bool raw = true) | メンバ変数 depthImage に Depth 画像をセットする。 引数が「なし」か「true」で呼び出された場合、各画素には距離がmm単位で設定される。 引数が「false」で呼び出された場合、各画素には距離を 65535/4500 倍した値が設定される。 すなわち 0〜4500 (mm) という距離を0 (黒) 〜 65535 (白) という白黒画像の輝度にマップした画像になる。 |
型 | 変数名 | 説明 |
---|---|---|
cv::Mat | depthImage | Depth 画像。
512x424の大きさで、各ピクセルは UINT16 で表現される。 画像の座標は DepthSpace 座標系における位置となる。
UINT16 depth = rgbImage.at<UINT16>(y , x ); |
データの種類によって、それを計測するセンサーの位置や解像度が異なります。 そのため、実世界での同じ位置の状態が、センサーによってそれぞれの座標系で表現された値として得られます。 異なるセンサーから得られたデータを同時に利用する場合は、 座標系の変換を行なってどちらかの座標系に合わせる必要があります。
Kinect V2 では、ColorSpace, DepthSpace, CameraSpace という3つの座標系があって、 それぞれの座標を表すデータ型 ColorSpacePoint, DepthSpacePoint, CameraSpacePoint が存在します。
Kinect for Windows SDK 2.0 の Kinect.h(抜粋) |
---|
typedef struct _ColorSpacePoint { float X; float Y; } ColorSpacePoint; typedef struct _DepthSpacePoint { float X; float Y; } DepthSpacePoint; typedef struct _CameraSpacePoint { float X; float Y; float Z; } CameraSpacePoint; |
RGB画像, Depth画像, 関節情報ではそれぞれ使っている座標系が異なります。 RGB画像の座標系は ColorSpace で、Depth画像の座標系は DepthSpace, 関節情報の座標系は CameraSpace です。
座標系 | 位置を表す型 | データの種類 |
---|---|---|
ColorSpace | ColorSpacePoint | RGB画像 |
DepthSpace | DepthSpacePoint | depth画像, bodyIndex画像, 赤外線画像 |
CameraSpace | CameraSpacePoint | skeleton情報 |
関節の位置を表すCameraSpace 座標系 |
---|
CameraSpace 座標系は、
(2016/11/12 図を変更し、説明を追記しました)。 |
Kinect V2 の ICoordinateMapper クラス が保持する「座標系の変換用メソッド」は次の通りです。
返り値の型 | メソッド名 | 説明 |
---|---|---|
HRESULT | MapCameraPointToColorSpace( CameraSpacePoint sp , ColorSpacePoint *cp ) |
CameraSpace 座標系での座標 sp を ColorSpace 座標系での座標に変換してcp にセットする。 返り値はS_OKかエラーコード。 |
HRESULT | MapCameraPointToDepthSpace( CameraSpacePoint sp , DelpthSpacePoint *dp ) |
CameraSpace 座標系での座標 sp を DepthSpace 座標系での座標に変換してdp にセットする。 返り値はS_OKかエラーコード。 |
HRESULT | MapDepthPointToColorSpace( DepthSpacePoint dp , UINT16 depth , ColorSpacePoint *cp ) |
DepthSpace 座標系での座標 dp と距離depth から ColorSpace 座標系での座標に変換してcp にセットする。 返り値はS_OKかエラーコード。 |
HRESULT | MapDepthPointToCameraSpace( DepthSpacePoint dp , UINT16 depth , CameraSpacePoint *sp ) |
DepthSpace 座標系での座標 dp と距離depth から CameraSpace 座標系での座標に変換してsp にセットする。 返り値はS_OKかエラーコード。 |
Kinect V2 で座標系の変換に使う ICoordinateMapper クラス のインスタンスは、 NtKinect のメンバ変数 coordinateMapper に保持されています。
型 | 変数名 | 説明 |
---|---|---|
CComPtr<ICoordinateMapper> | coordinateMapper | 座標変換を行う ICoordinateMapperのインスタンス。 |
kinect.setDepth()メソッドを呼び出して kinect.depthImage に距離データを設定します。 引数を指定していないので、距離データそのものを、すなわち、 対象までの距離をmm単位で取得できます。
2000mm よりも遠い画素を青で塗ることで、近くのものの映像だけを表示します。 500mmよりも小さい値は測定できていないだけなので、その画素は 8000mm 以遠として扱っています。
RGB画像とDepth画像は解像度が異なるので、Depth画像の1ピクセルを RGB画像の4ピクセルに対応させて 矩形領域を処理しています。
main.cpp |
|
上記のzipファイルには必ずしも最新の NtKinect.h が含まれていない場合があるので、 こちらから最新版をダウンロードして 差し替えてお使い下さい。