Obtener coordenadas de líneas no geométricas en una imagen binaria

Estoy tratando de reconocer posiciones de mano en OpenCV para Android. Quisiera reducir una forma detectada de la mano a un sistema de líneas simples (= secuencias del punto) . Estoy usando un algoritmo de dilución para encontrar las líneas esqueléticas de las formas de mano detectadas. He aquí un resultado ejemplar (imagen de mi mano izquierda):

Introduzca aquí la descripción de la imagen

En esta imagen me gustaría obtener las coordenadas de las líneas de esqueleto, es decir, "vectorizar" la imagen. He intentado HoughLinesP pero esto sólo produce conjuntos enormes de líneas muy cortas, que no es lo que quiero.

Mi segundo enfoque utiliza findContours :

 // Get contours Mat skeletonFrame; //image above ArrayList<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Imgproc.findContours(skeletonFrame, contours, new Mat(), Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE); // Find longest contour double maxLen = 0; MatOfPoint max = null; for (MatOfPoint c : contours) { double len = Imgproc.arcLength(Util.convert(c), true); //Util.convert converts between MatOfPoint and MatOfPoint2f if (len > maxLen) { maxLen = len; max = c; } } // Simplify detected contour MatOfPoint2f result = new MatOfPoint2f(); Imgproc.approxPolyDP(Util.convert(max), result, 5.0, false); 

Esto básicamente funciona; Sin embargo, los contornos devueltos por findContours siempre están cerrados, lo que significa que todas las líneas de esqueleto están representadas dos veces .

Resultado ejemplar: (líneas grises = contornos detectados, no líneas de esqueleto de la primera imagen)

Introduzca aquí la descripción de la imagen

Así que mi pregunta es: ¿Cómo puedo evitar estos contornos cerrados y sólo obtener una colección de "solo trazo" secuencias de puntos?

¿He extrañado algo en los documentos de OpenCV? No estoy necesariamente pidiendo código, una pista para un algoritmo que podría implementar también sería genial. ¡Gracias!

Comenzaría con el esqueleto real de la mano como cinemático

  1. Encontrar los dedos finales y la mano / base de la muñeca y el límite del perímetro (rojo)
  2. Resolver la cinemática inversa

    Por ejemplo por CCD para coincidir con los extremos de los dedos y no superponer la imagen. De esta manera usted debe obtener una respuesta anatómicamente correcta

  3. Para la simplificación puede utilizar cinemática como esta

    Radiografía / cinemática

    Usted debe manejar el varón / la hembra / el niño diferentemente (diversas longitudes del dedo) o utilizar una cierta clase de calibración o medida debido a las diversas longitudes del dedo. Como se puede ver saltar los huesos de la mano / muñeca de la base que no son tan importantes. El contorno rojo se puede encontrar donde el perímetro tiene un radio de curva más pequeño.

¿Cómo resolver su problema en su implementación actual?

El primer acercamiento del adelgazamiento es mejor así que cuando usted consiguió el conjunto enorme de líneas conéctelos a las polilíneas después de que calculan el ángulo de cada línea. Si dos líneas unidas tienen un ángulo similar (hasta treshold), luego unirse a ellos que deben hacer lo que quieras, pero no esperes que obtendrá las líneas similares a los huesos humanos, especialmente para las curvas el resultado será muy diferente. En ambos cuenta de líneas y forma.

Para obtener un mejor resultado es necesario utilizar el adelgazamiento geométrico

Pero no tengo Idea si está presente en OpenCV (no uso esta lib), la idea es encontrar la línea perimetral y desplazarla perpendicular hacia adentro por algún pequeño paso similar a esto . Parar si se desea el ancho se adquiere

Adelgazamiento geométrico

Cuando el perímetro desplazado conduce a una forma demasiado delgada, detenga allí y conecte al punto adelgazado del paso anterior (línea amarilla). Todo esto se hace en vectores (polilíneas) no en píxeles de imagen !!! El ancho se puede calcular como la distancia perpendicular más pequeña a cualquier línea cercana.

  • Android convierte matriz de bytes de la API de cámara para colorear objeto Mat openCV
  • Conversión de OpenCV C ++ a Java para problemas de detección de formas
  • Método eficaz para convertir un archivo de imagen de RGB a YUV
  • Reconocimiento Óptico de Caracteres Android con OpenCV
  • No se puede vincular la biblioteca nativa en la muestra de Android de OpenCV
  • Android OpenCV Encuentra la plaza o rectángulo más grande
  • Android: Grabación y transmisión simultánea
  • Error que coincide con ORB en Android
  • configuración de vídeo opencv a pantalla completa android
  • Guardar los vectores de características de ORB usando OpenCV4Android (java API)
  • ¿Cómo instalar OpenCV Manager en un emulador?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.