Вопрос по c# – Kinect Глубина и выравнивание кадров

8

Я играю с новым Kinect SDK v1.0.3.190. (другие связанные вопросы в stackoverflow находятся на предыдущем SDK Kinect) Я получаю потоки глубины и цвета от Kinect. Поскольку потоки глубины и RGB регистрируются разными датчиками, между двумя кадрами возникает несоосность, как можно видеть ниже.

Только RGB RGB

Только глубина Depth

Глубина & amp; RGB RGB & Depth equally blended

Мне нужно выровнять их, и есть функция с именем MapDepthToColorImagePoint именно для этой цели. Однако это, похоже, не работает. ниже приведен одинаково смешанный результат (глубина и отображенный цвет), который создается с помощью следующего кода

<code>            Parallel.For(0, this.depthFrameData.Length, i =>
        {
            int depthVal = this.depthFrameData[i] >> 3;
            ColorImagePoint point = this.kinectSensor.MapDepthToColorImagePoint(DepthImageFormat.Resolution640x480Fps30, i / 640, i % 640, (short)depthVal, ColorImageFormat.RgbResolution640x480Fps30);
            int baseIndex = Math.Max(0, Math.Min(this.videoBitmapData.Length - 4, (point.Y * 640 + point.X) * 4));

            this.mappedBitmapData[baseIndex] = (byte)((this.videoBitmapData[baseIndex]));
            this.mappedBitmapData[baseIndex + 1] = (byte)((this.videoBitmapData[baseIndex + 1]));
            this.mappedBitmapData[baseIndex + 2] = (byte)((this.videoBitmapData[baseIndex + 2]));
        });
</code>

где

<code>depthFrameData -> raw depth data (short array)

videoBitmapData -> raw image data (byte array)

mappedBitmapData -> expected result data (byte array)
</code>

порядок параметров, разрешение, размеры массива правильные (проверено дважды).

Результат кода: depth and MapDepthToColorImagePoint

Смещение продолжается! Еще хуже то, что результирующее изображение после использования MapDepthToColorImagePoint в точности совпадает с исходным изображением.

Был бы признателен, если бы кто-нибудь мог помочь мне узнать мою ошибку или хотя бы объяснить, для чего предназначен MapDepthToColorImagePoint (при условии, что я неправильно понял его функциональность)?

Ваш Ответ

2   ответа
1

Это очень распространенная проблема, которая присуща математике, связанной с синхронизацией двух изображений, поскольку две камеры находятся в двух разных местах. Вроде как брать два видеопотока с 3D-камеры и пытаться их синхронизировать. Они всегда будут немного выключены.

Две идеи для исправления:

  1. Manually shift the bits from the depth image as you calculate it.
  2. Add a shaker motor to the Kinect to reduce noise: http://www.youtube.com/watch?v=CSBDY0RuhS4 (I have found a simple pager motor to be effective.)

MapDepthToColorImagePoint предназначен для использования в Skeletal API для сопоставления скелетной точки с точкой глубины, а затем с точкой изображения, чтобы можно было показывать соединения поверх изображения RGB.

Надеюсь это поможет.

4

Это всегда будет происходить немного, потому что два датчика установлены в немного разных местах.

Попытайся:

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

Тем не менее: с некоторыми кодами API можно исправить многие проблемы.

Я использую Kinect для Windows 1.5, поэтому API немного отличаются от версии 1.0.

short[] depth=new short[320*240];
// fill depth with the kinect data
ColorImagePoint[] colorPoints=new ColorImagePoint[320*240];
// convert mappings
kinect.MapDepthFrameToColorFrame(DepthImageFormat.Resolution320x240Fps30,
            depth, ColorImageFormat.RgbResolution640x480Fps30, colorPoints);
// now do something with it
for(int i=0;i<320*240;i++)
{
  if (we_want_to_display(depth[i]))
  {
    draw_on_image_at(colorPoints[i].X,colorPoints[i].Y);
  }  
}

Это основы. Если вы посмотрите на пример с зеленым экраном в Kinect Developer Toolkit 1.5, он показывает хорошее применение для этого.

Похожие вопросы