image

Hola!

ha sido buscar en google / bing “Kinect Fusion” y después de 10 minutos, pensar que mejor lo intento explicar yo. Asi vamos por el principio, QUE NO ES KINECT FUSION.

  • Kinect Fusion NO es una aplicación para Kinect
  • Kinect fusion NO es un software para modelado en 3D

Y ahora MI DEFINICION DE KINECT FUSION

Kinect Fusion es una sería de libraries incluidas en el SDK de Kinect que nos permiten utilizar los sensores de Kinect para obtener información de la cámara y del sensor de profundidad con el que podemos crear modelos 3D. El procesamiento de estos sensores desde diferentes puntos de vista, permite crear los modelos 3D.

Listo! es tan simple como eso, En la página oficial de Kinect Fusion es posible encontrar más información o viendo el siguiente esquema seguro que a más de uno le aclara las ideas:

image

Ahora bien, lo interesante es que esto es parte del SDK y en el mismo tenemos bastante código para agregar esta funcionalidad en nuestras aplicaciones. Más adelante si tengo tiempo haré un Step by Step para explicar como crear una app desde cero, por ahora lo imporante es conocer el funcionamiento básico.

Una vez que agregas a tu solución “Microsoft.Kinect.Toolkit.Fusion”, la primera clase con la que debes familiarizarte es “Reconstruction.cs”.

image

La misma es la encargada de crear los modelos 3D con la información que recibe del sensor Kinect. Esto lo hace con la función FusionCreateReconstruction, que por suerte viene bastante bien documentada.

Nota: Zas en toda la cara para los no amigos de la documentación, por ahi un poco te ahorra un buen viaje entre el código.

   1: /// <summary>

   2: /// Initialize a Kinect Fusion 3D Reconstruction Volume.

   3: /// Voxel volume axis sizes must be greater than 0 and a multiple of 32.

   4: /// Users can select which device the processing is performed on with

   5: /// the <paramref name="reconstructionProcessorType"/> parameter. For those with multiple GPUs

   6: /// the <paramref name="deviceIndex"/> parameter also enables users to explicitly configure

   7: /// on which device the reconstruction volume is created.

   8: /// </summary>

   9: /// <param name="reconstructionParameters">

  10: /// The Reconstruction parameters to define the size and shape of the reconstruction volume.

  11: /// </param>

  12: /// <param name="reconstructionProcessorType">

  13: /// the processor type to be used for all calls to the reconstruction volume object returned

  14: /// from this function.

  15: /// </param>

  16: /// <param name="deviceIndex">Set this variable to an explicit zero-based device index to use

  17: /// a specific GPU as enumerated by NuiFusionGetDeviceInfo, or set to -1 to automatically

  18: /// select the default device for a given processor type.

  19: /// </param>

  20: /// <param name="initialWorldToCameraTransform">

  21: /// The initial camera pose of the reconstruction volume with respect to the world origin. 

  22: /// Pass identity as the default camera pose. 

  23: /// </param>

  24: /// <returns>The Reconstruction instance.</returns>

  25: /// <exception cref="ArgumentNullException">

  26: /// Thrown when the <paramref name="reconstructionParameters"/> parameter is null.

  27: /// </exception>

  28: /// <exception cref="ArgumentException">

  29: /// Thrown when the <paramref name="reconstructionParameters"/> parameter's <c>VoxelX</c>,

  30: /// <c>VoxelY</c>, or <c>VoxelZ</c> member is not a greater than 0 and multiple of 32 or the

  31: /// <paramref name="deviceIndex"/> parameter is less than -1 or greater than the number of

  32: /// available devices for the respective processor type.

  33: /// </exception>

  34: /// <exception cref="OutOfMemoryException">

  35: /// Thrown when the memory required for the Reconstruction volume processing could not be

  36: /// allocated.

  37: /// </exception>

  38: /// <exception cref="InvalidOperationException">

  39: /// Thrown when the Kinect Runtime could not be accessed, the Kinect device is not

  40: /// connected or the Reconstruction volume is too big so a GPU memory

  41: /// allocation failed, or the call failed for an unknown reason.

  42: /// </exception>

  43: public static Reconstruction FusionCreateReconstruction(

  44:     ReconstructionParameters reconstructionParameters,

  45:     ReconstructionProcessor reconstructionProcessorType,

  46:     int deviceIndex,

  47:     Matrix4 initialWorldToCameraTransform)

Una vez le has pasado la información del sensor a Reconstruction, el siguiente paso es crear el mundo virtual, aquí tenemos la función GetCurrentWorldToVolumeTransform, también dentro de Reconstruction.

   1: /// <summary>

   2: /// Get current internal world to volume transform.

   3: /// Note: A right handed coordinate system is used, with the origin of the volume (i.e. voxel 0,0,0) 

   4: /// at the top left of the front plane of the cube. Similar to bitmap images with top left origin, 

   5: /// +X is to the right, +Y down, and +Z is forward from origin into the reconstruction volume.

   6: /// The default transform is a combination of translation in X,Y to locate the world origin at the

   7: /// center of the front face of the reconstruction volume cube, and scaling by the voxelsPerMeter

   8: /// reconstruction parameter to convert from world coordinate system to volume voxel indices.

   9: /// </summary>

  10: /// <returns>The current world to volume transform. This is a similarity transformation

  11: ///  that converts world coordinates to volume coordinates.</returns>

  12: /// <exception cref="InvalidOperationException">

  13: /// Thrown when the call failed for an unknown reason.

  14: /// </exception>

  15: public Matrix4 GetCurrentWorldToVolumeTransform()

Una vez que tenemos esta “vista” (podríamos pensarlo como si fuese un “frame”), ya podemos continuar girando el sensor Kinect para buscar la siguiente y finalmente armar un modelo 3D.

Nota: Aquí entra en juego otra clase importante que es FusionPointCloudImageFrame, aunque no me animo a explicar la misma si no tengo un contexto claro de uso.

Y creo que por ahora con eso ya tengo bastante para explicar las 3 cosas básicas que tienes que mirar para crear apps que usen Kinect Fusion!

Recursos

Saludos @ Home

El Bruno

image image image Google

8 responses to “[#KINECTSDK] Comenzando con Kinect #Fusion”

  1. Saludos, hasta donde tengo entendido esto viene integrado en el toolkit fusion de microsoft, pero puedo acceder a todo el código programado en c# para modificarlo a mi manera, o esto viene protegido o es de código abierto, si no es de código abierto, dónde podría encontrar la programación de esta maravillosa aplicación con código abierto, para que pueda ser modificado y ejecutado en diferentes plataformas.

    Gracias

    Like

    1. Nano buenas
      pues efectivamente todo esto es open source (salvo el driver de Kinect for Windows), lo demás lo podes encontrar todo dentro del SDK de Kinect. Eso si, para KINECT FUSION olvidate de C#, los ejemplos son todos en C++ y si bien puedes hacer “algo” en C#, lo mejor es trabajar con esto en C++. Como siempre, los ejemplos los puedes descargar desde CodePlex en http://kinectforwindows.codeplex.com/ o en la sección de Developer de Kinect for Windows http://www.microsoft.com/en-us/kinectforwindows/develop/

      Saludos

      Like

  2. Para cuando un Step by step?
    Gracias

    Like

    1. En cuanto tenga tiempo y pueda volver a tener mi Kinect V2. Ahora la he prestado a un amigo y … ahi ha quedado >D

      Like

  3. jum yo estoy viendo como hacer un calculo de volumen corporal con kinect fusion , se puede?

    Like

    1. Hola Jesus
      Creo que se a lo que te refieres, y si se puede. Hace falta mucho cálculo, ya que una vez que tienes todo el “perfil en 3D” de un cuerpo hay que procesarlo, pero es posible.
      Saludos
      -El Bruno

      Like

  4. Bruno !… tienes un paso a paso de como escanear objetos con kinect v2 ?
    Hay muy poca información respecto a escaneos de objetos, todos está orientado a personas !

    Sería interesante y un gran desarrollo !

    Like

    1. Esta es la 5ta parte de un tutorial donde comentan como escanear objectos en 3D con un Kinect One
      https://channel9.msdn.com/Blogs/3D-Printing/3D-Builder-Tutorial-Part-5-3D-Scanning-with-Kinect-V2

      Saludos
      /Bruno

      Like

Leave a reply to Francuqo Cancel reply

Discover more from El Bruno

Subscribe now to keep reading and get access to the full archive.

Continue reading