Pergunta sobre kinect, c#, color-depth – Alinhamento de profundidade e enquadramento de imagem do Kinect

8

Estou brincando com o novo Kinect SDK v1.0.3.190. (outras questões relacionadas no stackoverflow estão no sdk do kinect anterior) Eu recebo fluxos de profundidade e cor do Kinect. Como a profundidade e os fluxos RGB são capturados com diferentes sensores, há um desalinhamento entre dois quadros, como pode ser visto abaixo.

Apenas RGB

Apenas profundidade

Profundidade e RGB

Eu preciso alinhá-los e existe uma função chamada MapDepthToColorImagePoint exatamente para essa finalidade. No entanto, não parece funcionar. aqui está um resultado igualmente misturado (profundidade e cor mapeada) abaixo do qual é criado com o seguinte código

<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>

Onde

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

videoBitmapData -> raw image data (byte array)

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

ordem dos parâmetros, resolução, tamanhos de matriz estão corretos (double checked).

O resultado do código é:

O desalinhamento continua! O que é ainda pior é que, resultado imagem depois de usar MapDepthToColorImagePoint é exatamente o mesmo com a imagem original.

Seria apreciado se alguém pudesse me ajudar a descobrir o meu erro ou pelo menos me explicar o que é MapDepthToColorImagePoint para (supondo que eu não entendi sua funcionalidade)?

Sua resposta

2   a resposta
4

Isso sempre acontece um pouco, porque os dois sensores são montados em lugares ligeiramente diferentes.

Tente:

Olhe para algum objeto com seus dois olhos, então tente usar apenas o olho esquerdo, depois apenas o olho direito. As coisas parecem um pouco diferentes porque seus dois olhos não estão exatamente no mesmo lugar.

No entanto, é possível corrigir muitos dos problemas com alguns dos códigos da API.

Eu estou usando o Kinect para Windows 1.5, então as APIs são um pouco diferentes do 1.0.

<code>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);
  }  
}
</code>

Isso é o básico. Se você observar o exemplo greenscreen no Kinect Developer Toolkit 1.5, ele será bem usado para isso.

1

Esse é um problema muito comum, algo inerente à matemática envolvida para sincronizar as duas imagens, já que as duas câmeras estão em dois lugares diferentes. É como pegar os dois feeds de vídeo produzidos por uma câmera 3D e tentar sincronizá-los. Eles estarão sempre um pouco fora.

Duas ideias para correção:

Mude manualmente os bits da imagem de profundidade à medida que você os calcula.Adicione um motor agitador ao Kinect para reduzir o ruído:http://www.youtube.com/watch?v=CSBDY0RuhS4 (Eu encontrei um motor de pager simples para ser eficaz.)

O MapDepthToColorImagePoint é para uso na API de esqueleto para mapear um ponto de esqueleto para um ponto de profundidade e, em seguida, para um ponto de imagem para que você possa mostrar as juntas na parte superior da imagem RGB.

Espero que isto ajude.

Perguntas relacionadas