2

Windows Kinect SDKを使用して、センサーから深度とRGB画像を取得しています。

深度画像とRGB画像が整列していないので、取得した深度画像にイメージマスクを使用したいので、RGB画像の座標を深度画像の座標に変換する方法を見つけたいと思います。 RGB画像の処理。

深度座標を色空間座標に変換する方法はすでにあります。

NuiImageGetColorPixelCoordinatesFromDepthPixel

残念ながら、その逆は存在しません。INUICoordinateMapperには難解な呼び出ししかありません。

HRESULT MapColorFrameToDepthFrame(
     NUI_IMAGE_RESOLUTION eColorResolution,
     NUI_IMAGE_RESOLUTION eDepthResolution,
     DWORD cDepthPixels,
     NUI_DEPTH_IMAGE_PIXEL *pDepthPixels,
     DWORD cDepthPoints,
     NUI_DEPTH_IMAGE_POINT *pDepthPoints
)

この方法がどのように機能するかは、十分に文書化されていません。誰かが以前にそれを使用したことがありますか?

自分で手動キャリブレーションを実行して変換行列を計算しようとしているので、解決策があればとても嬉しいです。

4

2 に答える 2

2

コメント投稿者の恐ろしいおかげで、いくつかの有用な情報を含むmsdnへのリンクを取得しました(APIを支援してくれたmsdnのT. Chenにも感謝します)。T. Chenの投稿から抽出した、RGBから深度座標空間へのマッピングを実行するコードは次のとおりです。

INuiCoordinateMapper* pMapper;

mNuiSensor->NuiGetCoordinateMapper(&pMapper);

pMapper->MapColorFrameToDepthFrame(
        NUI_IMAGE_TYPE_COLOR,
        NUI_IMAGE_RESOLUTION_640x480,
        NUI_IMAGE_RESOLUTION_640x480,
        640 * 480, 
        (NUI_DEPTH_IMAGE_PIXEL*)LockedRect.pBits,
        640 * 480, 
        depthPoints);

注:これを機能させるには、センサーを初期化し、深度フレームをロックする必要があります。

変換された座標は、たとえば、次のように照会できます。

/// transform RGB coordinate point to a depth coordinate point 
cv::Point TransformRGBtoDepthCoords(cv::Point rgb_coords, NUI_DEPTH_IMAGE_POINT *    depthPoints)
{
    long index = rgb_coords.y * 640 + rgb_coords.x;
    NUI_DEPTH_IMAGE_POINT depthPointAtIndex = depthPoints[index];
    return cv::Point(depthPointAtIndex.x, depthPointAtIndex.y); 
}
于 2012-11-12T21:36:19.800 に答える
1

私の知る限りMapColorFrameToDepthFrame、RGB画像のすべてのピクセルで座標系変換を効果的に実行し、変換の結果の深度画像座標と結果の深度値を出力NUI_DEPTH_IMAGE_POINT配列に保存します。その構造の定義は次のとおりです:http://msdn.microsoft.com/en-us/library/nuiimagecamera.nui_depth_image_point.aspx

おそらくこれはあなたのニーズにはやり過ぎかもしれません、そして私はその方法がどれほど速いかわかりません。XBOX Kinect開発者は、フレームレートでGPU上で実行されるその関数の非常に高速な実装を持っていますが、Windows開発者はそれほど幸運ではないかもしれません!

于 2012-11-12T16:32:42.063 に答える