2012-04-30 21 views
8

Estoy jugando con el nuevo Kinect SDK v1.0.3.190. (otras preguntas relacionadas en stackoverflow están en el SDK anterior de Kinect) Obtengo flujos de color y profundidad desde Kinect. Como las secuencias de profundidad y RGB se capturan con diferentes sensores, hay una desalineación entre dos cuadros, como se puede ver a continuación.Profundidad de Kinect y alineación de marcos de imagen

Sólo RGB RGB

Sólo Profundidad Depth

Profundidad & RGB RGB & Depth equally blended

necesito para alinearlos y hay una función llamada MapDepthToColorImagePoint exactamente para este propósito. Sin embargo, parece que no funciona. aquí es una igualmente mezclado (profundidad y color mapeada) resultar debajo de la cual se crea con el siguiente código

  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])); 
     }); 

donde

depthFrameData -> raw depth data (short array) 

videoBitmapData -> raw image data (byte array) 

mappedBitmapData -> expected result data (byte array) 

orden de los parámetros, la resolución, tamaños de matriz son correctos (doble marcado) .

El resultado del código es: depth and MapDepthToColorImagePoint

La desalineación continúa! Lo que es aún peor es que, la imagen resultante después de usar MapDepthToColorImagePoint es exactamente igual con la imagen original.

Sería de agradecer si alguien pudiera ayudarme a descubrir mi error o al menos explicarme para qué sirve MapDepthToColorImagePoint (suponiendo que malinterpreté su funcionalidad)?

Respuesta

1

Este es un problema muy común, algo inherente a las matemáticas involucradas para sincronizar las dos imágenes, ya que las dos cámaras están ubicadas en dos lugares diferentes. Algo así como tomar las dos transmisiones de video producidas por una cámara 3D e intentar sincronizarlas. Siempre estarán levemente fuera de juego.

Dos ideas para la corrección:

  1. cambiar manualmente los bits de la imagen de profundidad a medida que calcularlo.
  2. Añadir un motor agitador a la Kinect para reducir el ruido: http://www.youtube.com/watch?v=CSBDY0RuhS4 (he encontrado un motor localizador simple para ser eficaz.)

El MapDepthToColorImagePoint es para su uso en la API esquelético para trazar un punto del esqueleto de un punto de profundidad y luego un punto de imagen para que pueda mostrar las uniones en la parte superior de la imagen RGB.

Espero que esto ayude.

4

Esto siempre ocurrirá levemente porque los dos sensores están montados en lugares ligeramente diferentes.

Inténtelo:

mirada en algún objeto con sus dos ojos, a continuación, tratar usando sólo su ojo izquierdo, entonces sólo su ojo derecho. Las cosas se ven un poco diferentes porque tus dos ojos no están exactamente en el mismo lugar.

Sin embargo, es posible corregir una gran cantidad de problemas con algunos de los códigos API.

Estoy usando Kinect para Windows 1.5, por lo que las API son ligeramente diferentes de las 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); 
    } 
} 

Eso es lo básico. Si observa el ejemplo de greenscreen en Kinect Developer Toolkit 1.5, muestra un buen uso para esto.

Cuestiones relacionadas