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 градусов и имеет смещение. У кого-нибудь есть предложения, что я делаю не так? Любая помощь приветствуется.

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

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

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

4

Решение

Я наконец понял это: по какой-то причине возвращенные 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;
}
3

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector