Отображение глубины цвета Kinect v2 с использованием C#

Я пытаюсь отобразить карту глубины на цветовое пространство, используя функцию координат Mapper из SDK. Однако полученный результат не соответствует ожидаемому, он имеет меньшее соотношение сторон, и изображение кажется зеркальным.

Ниже приведен код, который я использовал:

depthWidth = depthFrameDescription.Width;
depthHeight = depthFrameDescription.Height;

var colorDesc = colorFrame.FrameDescription;
int colorWidth = colorDesc.Width;
int colorHeight = colorDesc.Height;

int size = colorWidth * colorHeight;

DepthSpacePoint[] colSpacePoints = new DepthSpacePoint[colorWidth * colorHeight];

using (KinectBuffer depthFrameData = depthFrame.LockImageBuffer())
using (KinectBuffer colorBuffer = colorFrame.LockRawImageBuffer())
{
    this.bitmap.Lock();

    if ((colorWidth == this.bitmap.PixelWidth) && (colorHeight == this.bitmap.PixelHeight))
    {
        byte[] colorFrameData = new byte[size * bytesPerPixel];       

        // Map the values here
        ushort [] frameData = new ushort[depthWidth * depthHeight];
        depthFrame.CopyFrameDataToArray(frameData);
        coordinateMapper.MapColorFrameToDepthSpace(frameData, colSpacePoints);

        this.bitmap.WritePixels(new Int32Rect(0, 0, colorWidth, colorHeight), colSpacePoints, colorWidth * bytesPerPixel, 0);
        this.bitmap.AddDirtyRect(new Int32Rect(0, 0, this.bitmap.PixelWidth, this.bitmap.PixelHeight));
    }    
    this.bitmap.Unlock();
}

this.bitmapBackBufferSize = (uint)![enter image description here][1]((this.bitmap.BackBufferStride * (this.bitmap.PixelHeight - 1)) + (this.bitmap.PixelWidth * this.bytesPerPixel));
isBitmapLocked = true;

1 ответ

Если вы пытаетесь отобразить координаты рамки глубины на цветную рамку, вам не хватает одного шага.

Вот ссылка, которая, вероятно, объясняет это лучше, чем я могу: http://www.bryancook.net/2014/03/mapping-between-kinect-color-and-depth.html

Но в вашем случае, когда вы используете

coordinateMapper.MapColorFrameToDepthSpace(frameData, colSpacePoints);

Вывод не должен использоваться, как вы его используете. Выходные данные этой функции содержат все точки, которые существуют как в цветовом пространстве, так и в пространстве глубины. Таким образом, чтобы отобразить их, вы хотите перебрать свои colSpacePoints и сделать что-то с каждым результатом, в примере, который я связал, он называется _colorSpacePoints, чтобы вы могли посмотреть, что он с ним делает.

Я застрял, пытаясь сделать, вероятно, что-то похожее на то, что вы делаете, однако через несколько дней я нашел, как правильно использовать отображение. Если вам нужна дополнительная помощь в решении вашей проблемы, скажите мне, что вы хотите отобразить на вашем WriteableBitmap.

Другие вопросы по тегам