2015-01-11 5 views
4

Я пытаюсь отобразить координаты из цветового пространства в пространство камеры. код я использую следующее:Kinect v2 сопоставление цветовых координат с пространством камеры

HRESULT ModelRecognizer::MapColorToCameraCoordinates(const std::vector<ColorSpacePoint>& colorsps, std::vector<CameraSpacePoint>& camerasps) 
{ 
    //Access frame 
    HRESULT hr = GetDepthFrame(); 

    if (SUCCEEDED(hr)) 
    { 
     ICoordinateMapper* pMapper; 
     hr = m_pKinectSensor->get_CoordinateMapper(&pMapper); 
     if (SUCCEEDED(hr)) 
     { 
      CameraSpacePoint* cameraSpacePoints = new CameraSpacePoint[cColorWidth * cColorHeight]; 
      hr = pMapper->MapColorFrameToCameraSpace(nDepthWidth * nDepthHeight, depthImageBuffer, cColorWidth * cColorHeight, cameraSpacePoints); 
      if (SUCCEEDED(hr)) 
      { 
       for (ColorSpacePoint colorsp : colorsps) 
       { 
        long colorIndex = (long)(colorsp.Y * cColorWidth + colorsp.X); 
        CameraSpacePoint csp = cameraSpacePoints[colorIndex]; 
        camerasps.push_back(csp); 
       } 
      } 
      delete[] cameraSpacePoints; 
     } 
    } 
    ReleaseDepthFrame(); 
    return hr; 
} 

Я не получаю никаких ошибок, однако, результат, кажется, поворачивается на 180 градусов и имеет смещение. У кого-нибудь есть предложения, что я делаю неправильно? Любая помощь приветствуется.

Просто чтобы дать большую картину, почему мне нужно это:

Я отслеживание цветных ленты наклеены на стол из цветного изображения с использованием открытого резюме. Затем я создаю стены в местах ленты в трехмерной сетке. Кроме того, я использую KinectFusion для создания сетки других объектов в таблице. Однако, когда я открываю обе сетки в Мешлабе, отчетливо видно несоосность. Поскольку я предполагаю, что сетка KinectFusion создана правильно в CameraSpace, и я создаю сетку стен точно в CameraSpacePoints, возвращенных вышеуказанной функцией, я уверен, что ошибка заключается в процедуре CoordinateMapping.

изображения, показывающие смещение можно найти на http://imgur.com/UsrEdZb,ZseN2br#0, http://imgur.com/UsrEdZb,ZseN2br#1

ответ

3

Я наконец понял это: По какой причине возвращенный CameraSpacePoints отражались в начале координат X и Y, но не в Z. Если кто-то имеет Объяснение этому мне все еще интересно.

Он работает со следующим кодом сейчас:

/// <summary> 
/// Maps coordinates from ColorSpace to CameraSpace 
/// Expects that the Points in ColorSpace are mirrored at x (as Kinects returns it by default). 
/// </summary> 
HRESULT ModelRecognizer::MapColorToCameraCoordinates(const std::vector<ColorSpacePoint>& colorsps, std::vector<CameraSpacePoint>& camerasps) 
{ 
    //Access frame 
    HRESULT hr = GetDepthFrame(); 

    if (SUCCEEDED(hr)) 
    { 
     ICoordinateMapper* pMapper; 
     hr = m_pKinectSensor->get_CoordinateMapper(&pMapper); 
     if (SUCCEEDED(hr)) 
     { 
      CameraSpacePoint* cameraSpacePoints = new CameraSpacePoint[cColorWidth * cColorHeight]; 
      hr = pMapper->MapColorFrameToCameraSpace(nDepthWidth * nDepthHeight, depthImageBuffer, cColorWidth * cColorHeight, cameraSpacePoints); 
      if (SUCCEEDED(hr)) 
      { 
       for (ColorSpacePoint colorsp : colorsps) 
       { 
        int colorX = static_cast<int>(colorsp.X + 0.5f); 
        int colorY = static_cast<int>(colorsp.Y + 0.5f); 
        long colorIndex = (long)(colorY * cColorWidth + colorX); 
        CameraSpacePoint csp = cameraSpacePoints[colorIndex]; 
        camerasps.push_back(CameraSpacePoint{ -csp.X, -csp.Y, csp.Z }); 
       } 
      } 
      delete[] cameraSpacePoints; 
     } 
    } 
    ReleaseDepthFrame(); 
    return hr; 
} 
+1

Работал его. https://msdn.microsoft.com/en-us/library/windowspreview.kinect.cameraspacepoint.aspx Что касается датчика, X + находится слева, как он видит, Y + находится к небу, и Z + находится вдали от датчика. Таким образом, ваши координаты могут работать иначе, чем это. Для моих целей, используя openframeworks, ваша коррекция выравнивает X, Y и Z. –

+0

благодарит вас за разъяснение @NickDevereaux :) Еще немного странно, что они решили поставить X + слева. – Heribert

Смежные вопросы