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!

One Solution collect form web for “Obtener coordenadas de líneas no geométricas en una imagen binaria”

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.

  • Detección de objetos reales utilizando la cámara. Posibilidades de encontrar objetos reales usando cámara
  • Mejorar el rendimiento de Tesseract con OpenCV en Android
  • Error: Programa "/ NDK-build" no se encuentra en PATH
  • ¿Se puede utilizar un android.hardware.camera2.CaptureRequest con OpenCV?
  • Android - utiliza la cámara sin vista de superficie o textureview
  • Multiplicación básica de matriz en OpenCV para Android
  • Cómo extraer formas geométricas simples de contornos en opencv
  • Error: el paquete android.hardware.camera2 no existe OpenCV
  • Encuentra color dominante en un marco de cámara en OpenCV Android
  • OpenCV de Android: No se encontró identificador de recurso para el atributo 'camera_id' en el paquete
  • Cómo procesar una imagen con OpenCV onPictureTaken?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.