2011-04-19 9 views
17

Estoy construyendo una aplicación que tomará una imagen del cuerpo de una sola persona y producirá una "foto policial" para esa persona.¿Cómo obtener una "foto policial" de los cuadros de detección de rostros?

Mugshot significa una imagen de la cara, el cuello, el pelo y las orejas de toda la persona con el mismo tamaño general de otra foto policial.

Actualmente estoy usando
http://askernest.com/archive/2008/05/03/face-detection-in-c.aspx
para implementar OpenCV y estoy usando

harrcascade_frontalface_default.xml 
harrcascade_frontalface_alt.xml 
harrcascade_frontalface_alt2.xml 
harrcascade_frontalface_alt_tree.xml 

como mis cascadas.

Uso todas las cascadas porque una sola no detectará todas mis caras. Después de obtener todas las caras detectadas por todas las cascadas, encuentro mi casilla promedio y la utilizo para calcular por última vez qué tan alta y ancha debe ser la ficha policial.

Mi problema es 3 partes.

  • Mi proceso actual es bastante lento. ¿Cómo puedo acelerar el proceso de detección?
    Edit: Estoy descubriendo que el tiempo de procesamiento está directamente relacionado con el tamaño de la foto. Reducir el tamaño de las fotos puede ser útil.

  • Una sola cascada no detectará todas las caras que encuentro, así que las estoy usando todas. Esto, por supuesto, produce muchos cuadrados variados y algunos falsos positivos. ¿Qué método puedo usar para identificar los falsos positivos y dejarlos fuera del cálculo cuadrado promedio? ex. SandmanWayne
    Edit: Estoy implementando un promedio de valores dentro de la desviación estándar. Publicaremos el código pronto.

  • No estoy seguro de la mejor manera de encontrar la foto de la ficha dado las coordenadas cuadradas de la cara. ¿Dónde puedo encontrar la relación cara a tapa?
    Editar: Resolvió esta. Suponiendo que todas mis cabezas son proporciones de sus caras.

    static public Rectangle GetMugshotRectangle(Rectangle rFace) 
    { 
        int y2, x2, w2, h2; 
    
        //adjust as neccessary 
        double heightRatio = 2; 
    
        y2 = Convert.ToInt32(rFace.Y - rFace.Height * (heightRatio - 1.0)/2.0); 
        h2 = Convert.ToInt32(rFace.Height * heightRatio); 
        //height to width ratio is 1.25 : 1 in mugshots 
        w2 = Convert.ToInt32(h2 * 4/5); 
        x2 = Convert.ToInt32((rFace.X + rFace.Width/2) - w2/2); 
    
        return new Rectangle(x2, y2, w2, h2); 
    } 
    

    Sandman
    que sólo tiene que deshacerse de los falsos positivos.

Ok make that 4 issues.

  • Nuestra cámara que vamos a utilizar esta actualmente fuera de servicio, así que no tengo un método de captura de imágenes en el momento. ¿Dónde puedo encontrar imágenes de cuerpo completo de personas que no son prontas como la búsqueda de imágenes de Google para imágenes de cuerpo completo?
    Editar: "Persona de pie" hace una buena búsqueda :)
+2

¿Esa es la iglesia de Thomas Hayden? –

+0

Es el hombre de arena en Spiderman jaja –

Respuesta

0

Ok, lo descubrí pero el proyecto está en hielo por el momento.
No tengo la fuente para pegar ya que la VM tarda una eternidad en cargarse.
Si alguien está realmente interesado, hágamelo saber y lo publicaré.
Si ve algo que parece que podría hacerse mejor, hágamelo saber.

Los pasos que tomé fueron los siguientes.

  1. Cargue la imagen, si más de 500 píxeles en altura o ancho hacen una nueva imagen de una versión reducida a un máximo de 500px de alto o alto. Guarde la balanza.
  2. Ejecute la implementación C# OpenCV en Ask Ernest en todos los Harrcasscades frontales en Harrtraining.
  3. Por alguna razón, los rectángulos producidos por Ask Ernest deben ampliarse 1.3X
  4. Con los rectángulos generados, utilice standard deviation para eliminar los falsos positivos. Hice esto para cada esquina del rectángulo encontrando la distancia que cada esquina de rectángulo estaba fuera de la ubicación de esquina promedio. Tomé nota de cualquier rectángulo que tenía una esquina fuera de control y lo eliminé de la lista de rectángulos candidatos.
  5. Obtenga el rectángulo promedio de los rectángulos restantes y aplique "GetMugshotRectangle" desde arriba en la pregunta.
  6. Escale el recuadro de captura de cuadro con la escala que guardamos en el paso 1.
  7. Recorte la fotografía de la imagen original y guárdela en su nueva ubicación.

¡Hecho!

1

Una sola cascada podía hacer lo que todos sus cascadas de proceder en caso de que se ha configurado de esta manera, además de que no le da varios resultados para juzgar desde.Las cascadas que usa son quizás diferentes en la colección de imágenes de enseñanza de las que están hechas o en algunos parámetros.

Puede encontrar un tutorial sobre cómo construir una cascada propia here. Sería útil obtener las imágenes utilizadas para entrenar las cuatro cascadas que utiliza, pero no sé si están a disposición del público.

+0

Ahí es donde obtuve mis cascadas actuales. Todavía no estoy seguro de querer hacer el esfuerzo de construir mi propia cascada. No tengo exactamente 5000 imágenes de 1000 caras únicas. –

+0

Tal vez haya algunas "reglas de adición" que se apliquen a las cascadas para que se pueda construir una nueva cascada a partir de varias que se comporten como si estuvieran entrenadas con todas las imágenes de cascadas. Pero me parece complicado también ... – dronus

0

Le sugiero que utilice la parte superior del cuerpo del archivo de la cascada Haar que le devolverá el rectángulo hasta el hombro. Encuentra el archivo de cascada de cabeza y hombros en "http://alereimondo.no-ip.org/OpenCV/34"

Cuestiones relacionadas