tutorial objetos español ejemplos deteccion con opencv image-processing computer-vision kinect openni

opencv - objetos - Reconocimiento de gestos con los dedos/manos usando Kinect



ejemplos opencv python (8)

Déjame explicar mi necesidad antes de explicar el problema. Estoy esperando una aplicación controlada a mano. Navegación utilizando la palma y clics con agarre / puño.

Actualmente, estoy trabajando con Openni, que suena prometedor y tiene pocos ejemplos que resultaron útiles en mi caso, ya que tenía un rastreador de mano inbuild en las muestras. que sirve mi propósito por el tiempo.

Lo que quiero preguntar es,

1) ¿cuál sería el mejor enfoque para tener un detector de puño / agarre?

Entrené y usé clasificadores de puños Adaboost en datos RGB extraídos, lo cual fue bastante bueno, pero tiene demasiadas detecciones falsas para seguir adelante.

Entonces, aquí marco dos preguntas más

2) ¿Hay alguna otra buena biblioteca que sea capaz de alcanzar mis necesidades usando datos de profundidad?

3) ¿Podemos entrenar nuestros propios gestos con las manos, especialmente con los dedos, ya que algunos papeles se referían a HMM, en caso afirmativo, ¿cómo procedemos con una biblioteca como OpenNI?

Sí, lo intenté con las librerías de middleware en OpenNI, como el detector de captura, pero no servirán a mi propósito, ya que no es de código abierto ni coincide con mi necesidad.

Además de lo que pregunté, si hay algo que piensas, que podría ayudarme, será aceptado como una buena sugerencia.


1) Si hay muchas detecciones falsas, podría tratar de ampliar el conjunto de muestras negativas del clasificador y volver a entrenarlo. El conjunto de imágenes negativas extendidas debería contener tales imágenes, donde el puño se detectó en falso. Tal vez esto ayude a crear un mejor clasificador.



He tenido bastante éxito con la biblioteca de middleware proporcionada por http://www.threegear.com/ . Proporcionan varios gestos (incluyendo agarrar, pellizcar y señalar) y 6 hand-seguimiento DOF.


La respuesta rápida es: Sí, puede entrenar su propio detector de gestos utilizando datos de profundidad. Es realmente fácil, pero depende del tipo de gesto.

Supongamos que quiere detectar un movimiento de mano:

  1. Detecta la posición de la mano (x,y,x) . Usar OpenNi es sencillo ya que tienes un nodo para la mano
  2. Ejecute el gesto y recolecte TODAS las posiciones de la mano durante el gesto.
  3. Con la lista de posiciones, entrena un HMM. Por ejemplo, puede usar Matlab , C o Python .
  4. Para sus propios gestos, puede probar el modelo y detectar los gestos.

Aquí puede encontrar un buen tutorial y código (en Matlab). El código ( test.m es bastante fácil de seguir). Aquí hay un snipet:

%Load collected data training = get_xyz_data(''data/train'',train_gesture); testing = get_xyz_data(''data/test'',test_gesture); %Get clusters [centroids N] = get_point_centroids(training,N,D); ATrainBinned = get_point_clusters(training,centroids,D); ATestBinned = get_point_clusters(testing,centroids,D); % Set priors: pP = prior_transition_matrix(M,LR); % Train the model: cyc = 50; [E,P,Pi,LL] = dhmm_numeric(ATrainBinned,pP,[1:N]'',M,cyc,.00001);

Tratar con los dedos es más o menos lo mismo, pero en lugar de detectar la mano, necesitas detectar los dedos. Como Kinect no tiene puntos con los dedos, debe usar un código específico para detectarlos (mediante la segmentación o el seguimiento del contorno). Algunos ejemplos que usan OpenCV se pueden encontrar aquí y aquí , pero el más prometedor es la biblioteca ROS que tiene un nodo de dedo (ver ejemplo aquí ).


Lea mi trabajo :) http://robau.files.wordpress.com/2010/06/final_report_00012.pdf

Investigué sobre el reconocimiento de gestos para las manos y evalué varios enfoques que son robustos a escala, rotación, etc. Tiene información de profundidad que es muy valiosa, ya que el problema más difícil para mí fue segmentar la mano de la imagen.

Mi enfoque más exitoso es seguir el contorno de la mano y para cada punto del contorno, tome la distancia al centroide de la mano. Esto proporciona un conjunto de puntos que pueden usarse como entrada para muchos algoritmos de entrenamiento.

Utilizo los momentos de imagen de la mano segmentada para determinar su rotación, por lo que hay un buen punto de inicio en el contorno de las manos. Es muy fácil determinar un puño, una mano estirada y la cantidad de dedos extendidos.

Tenga en cuenta que aunque funciona bien, su brazo tiende a cansarse de apuntar al aire.


No necesita entrenar su primer algoritmo ya que complicará las cosas. No use color ya que no es confiable (se mezcla con el fondo y cambia de forma impredecible dependiendo de la iluminación y el punto de vista)

  1. Suponiendo que su mano es el objeto más cercano, simplemente puede segmentarlo por el umbral de profundidad. Puede establecer el umbral manualmente, usar una región más cercana de histograma de profundidad, o realizar un componente conectado en un mapa de profundidad para dividirlo primero en partes significativas (y luego seleccionar su objeto no solo en su profundidad sino también en sus dimensiones, movimiento, usuario entrada, etc.). Aquí está la salida de un método de componentes conectados:
  2. Aplique defectos convexos de la biblioteca de OpenCV para encontrar los dedos;

  3. Rastree los dedos en lugar de redescubrirlos en 3D. Esto aumentará la estabilidad. Implementé con éxito la detección de dedo hace aproximadamente 3 años.


Parece que no está al tanto de Point Cloud Library (PCL) . Es una biblioteca de código abierto dedicada al procesamiento de nubes de puntos y datos RGB-D, que se basa en OpenNI para las operaciones de bajo nivel y que proporciona una gran cantidad de algoritmos de alto nivel , por ejemplo para realizar el registro, la segmentación y también reconocimiento.

Un algoritmo muy interesante para el reconocimiento de forma / objeto en general se llama modelo de forma implícita . Para detectar un objeto global (como un automóvil o una mano abierta), la idea es detectar primero las posibles partes (por ejemplo, ruedas, tronco, etc., o los dedos, la palma, la muñeca, etc.) utilizando un detector de características local , y luego inferir la posición del objeto global al considerar la densidad y la posición relativa de sus partes. Por ejemplo, si puedo detectar cinco dedos, una palma y una muñeca en un vecindario dado, hay una buena posibilidad de que de hecho esté mirando una mano, sin embargo, si solo detecto un dedo y una muñeca en alguna parte, podría ser un par de detecciones falsas. El artículo de investigación académica sobre este algoritmo de modelo de forma implícita se puede encontrar aquí .

En PCL, hay un par de tutoriales dedicados al tema de reconocimiento de formas, y afortunadamente, uno de ellos cubre el modelo de formas implícitas , que se ha implementado en PCL. Nunca probé esta implementación, pero por lo que pude leer en el tutorial, puede especificar sus propias nubes de puntos para el entrenamiento del clasificador.

Dicho esto , no lo mencionó explícitamente en su pregunta, pero dado que su objetivo es programar una aplicación controlada a mano, de hecho podría estar interesado en un algoritmo de detección de forma en tiempo real . Debería probar la velocidad del modelo de forma implícita proporcionado en PCL, pero creo que este enfoque es más adecuado para el reconocimiento de formas fuera de línea.

Si necesita reconocimiento de forma en tiempo real, creo que primero debería usar un algoritmo de seguimiento mano / brazo (que generalmente es más rápido que la detección completa) para saber dónde buscar en las imágenes, en lugar de intentar realizar una forma completa detección en cada cuadro de su secuencia RGB-D. Por ejemplo, podría rastrear la ubicación de la mano al segmentar el mapa de profundidad (por ejemplo, utilizando un umbral apropiado en la profundidad) y luego detectar las profundidades.

Luego, una vez que sepa aproximadamente dónde está la mano, será más fácil decidir si la mano está haciendo un gesto relevante para su aplicación. No estoy seguro de lo que significa exactamente con gestos de puño / agarre, pero sugiero que defina y use algunos gestos de control de aplicaciones que son fáciles y rápidos de distinguir entre sí.

Espero que esto ayude.


Si solo necesita la detección de un estado de puño / agarre, debería darle una oportunidad a microsoft. Microsoft.Kinect.Toolkit.Interaction contiene métodos y eventos que detectan el estado de liberación de agarre / agarre de una mano. Eche un vistazo al HandEventType of InteractionHandPointer . Eso funciona bastante bien para la detección de puño / agarre, pero no detecta ni informa la posición de los dedos individuales.

El siguiente kinect (kinect one) detecta 3 articulaciones por mano (muñeca, mano, pulgar) y tiene 3 gestos basados ​​en la mano: abierto, cerrado (agarre / puño) y lazo (puntero). Si eso es suficiente para ti, debes considerar las bibliotecas de microsoft.