Automático de detección de la cara usando Picasa API para extraer imágenes individuales

(Una pregunta similar se ha pedido en superusuario en busca de respuestas relacionadas con las aplicaciones. La pregunta es publicado aquí para reunir programable soluciones para el mismo)

En mi lugar de trabajo, fotografías tamaño pasaporte son escaneados juntos, después se corta en cada una de las fotos y se guarda con el archivo único de los números. En la actualidad utilizamos Paint.net para seleccionar manualmente, cortar y guardar las imágenes.

Ejemplo De Documento Digitalizado De Picasa Captura De Pantalla:
(de: búsqueda de imágenes de google de fuentes múltiples, fairuse)

Automático de detección de la cara usando Picasa API para extraer imágenes individuales

Por ejemplo. En Picasa 3.8, En, haga clic en Ver > la Gente, todas las caras que se muestran y me pide nombre de ellos, puedo guardar cada una de estas imágenes automáticamente con los nombres como diferentes imágenes?

Actualizado

Todo lo que quiero hacer es convertir la imagen de arriba, a cada una de las fotos.

En la imagen de arriba, he mostrado cómo Picasa 3.8 detecta las imágenes y me impulsa a nombre de ellos. No necesito el reconocimiento de rostros, sólo necesito detección de la cara. Picasa detecta las imágenes individuales y los muestra en el lado derecho. Cada una de estas imágenes son lo que necesito. Picasa crea una .ini archivo que guarda los valores hex que contiene las coordenadas de las caras individuales.

Cada una de estas caras son lo que me interesa Si puedo tener las coordenadas, me pueden recortar las imágenes necesarias de la imagen.

SAMPLE.jpg

Automático de detección de la cara usando Picasa API para extraer imágenes individuales

ini contenido

 [SAMPLE.jpg]
faces=rect64(c18f4c8ef407851e),d4ff0a020be5c3c0;rect64(534a06d429ae627),dff6163dfd9d4e41;rect64(b9c100fae46b3046),e1059dcf6672a2b3;rect64(7b5105daac3a3cf4),4fc7332c107ffafc;rect64(42a036a27062a6c),ef86c3326c143248;rect64(31f4efe3bd68fd8),90158b3d3b65dc9b;rect64(327904e0614d390d),43cbda6e92fcb63e;rect64(4215507584ae9b8c),15b6a967e857f334;rect64(895d4efeb8b68425),5c4ff70ac70b27d3
backuphash=3660

*El archivo ini parece ser el ahorro de las coordenadas de la cara etiquetas como rect64(534a06d429ae627),dff6163dfd9d4e41 para cada etiqueta.
Citando de Sitio De Ayuda De Picasa usuario Technonath dice

@oedious escribió:- Esto va a ser
un poco técnico, por lo que aferrarse.
* El número encerrado en rect64() es una de 64-bit número hexadecimal.
* Romper que en cuatro números de 16 bits.
* Dividir cada uno por el máximo de 16 bits sin signo de número (65535) y tendrá
cuatro números entre 0 y 1.
* Los cuatro números restantes dar coordenadas relativas para la cara
rectángulo: (izquierda, arriba, derecha, abajo).
* Si usted desea terminar con coordenadas absolutas, múltiples la izquierda y
derecho por el ancho de la imagen y la parte superior
y abajo por la altura de la imagen.

La cita anterior habla sobre el número encerrado en rect64 () ¿el número fuera de los paréntesis después de la coma?

He pedido una pregunta relacionada. Respuestas de lo que puede ayudar a usted también.
Obtener cuatro números de 16 bits a partir de un valor hexadecimal de 64 bits

Nota: La
ini detalles son los mismos que picasa
generado por la imagen en particular.

Además de la cuestión ha sido actualizado varias veces y no puede ser lo suficientemente clara.

Hay algunas respuestas en el Sitio de Ayuda de Picasa, donde me hizo la misma pregunta
Una de las respuestas de ese hilo para obtener las coordenadas basado en los valores hexadecimales en el archivo ini. El siguiente código está en C# a partir de esac desde el sitio de ayuda. Puedo hacer lo mismo en PHP?

public static RectangleF GetRectangle(string hashstr)
{
    UInt64 hash = UInt64.Parse(hashstr, System.Globalization.NumberStyles.HexNumber);
    byte[] bytes = BitConverter.GetBytes(hash);

    UInt16 l16 = BitConverter.ToUInt16(bytes, 6);
    UInt16 t16 = BitConverter.ToUInt16(bytes, 4);
    UInt16 r16 = BitConverter.ToUInt16(bytes, 2);
    UInt16 b16 = BitConverter.ToUInt16(bytes, 0);

    float left = l16 / 65535.0F;
    float top = t16 / 65535.0F;
    float right = r16 / 65535.0F;
    float bottom = b16 / 65535.0F;

    return new RectangleF(left, top, right - left, bottom - top);
} 

Código PHP tratando de convertir de 64 bits para los números entre el 1 y el 0

<?php
$dim = getimagesize("img.jpg");    
$hex64=array();
$b0="c18f4c8ef407851e";
$hex64[]=substr($b0,0,4);
$hex64[]=substr($b0,4,4);
$hex64[]=substr($b0,8,4);
$hex64[]=substr($b0,12,4);
$width=$dim[0];
$height=$dim[1];
foreach($hex64 as $hex16){
$dec=hexdec($hex16);
$divide=65536;
$mod=$dec%$divide;
$result=$dec/$divide;
$cordinate1=$result*$width;
$cordinate2=$result*$height;
echo "Remainder 1 : ".$mod." ; Result 1 :  ".$result."<br/>CO-ORDINATES : <B>".$cordinate1." ".$cordinate2."</B><br/>";
}
?>

La salida

Resto 1 : 49551 ; Resultado 1 :
0.75608825683594 COORDENADAS : 371.99542236328 396.94633483887 Resto 1 : 19598 ; Resultado 1 :
0.29904174804688 COORDENADAS : 147.12854003906 156.99691772461 Resto 1 : 62471 ; Resultado 1 :
0.95323181152344 COORDENADAS : 468.99005126953 500.4467010498 Resto 1 : 34078 ; Resultado 1 :
0.51998901367188 COORDENADAS : 255.83459472656 272.99423217773

Así que tengo las coordenadas demasiado y @Nirmal ha se muestra cómo recortar. Ahora los próximos pasos serían para analizar picasa.ini para el hexagonal de códigos y nombres de archivo y de integrar el código. Picasa no se proporcionan en la actualidad los códigos hex a través de una api(o Hacer que?). Si ese fuera el caso, habría sido mejor.

Así que nos estamos acercando a una solución. Gracias a todos, me gustaría que me podría otorgar la recompensa a todo el mundo(yo no, pero no tengas miedo y mirar hacia fuera para un aumento en su rep!)

Le puede dar el final de coordenadas en el (x,y) formato para todas las cuatro esquinas?
@Nirmal (371,156),(468,156),(468,272),(371,272)

OriginalEl autor |

7 Kommentare

  1. 3

    Para responder a la picasa pregunta, a ver esta respuesta en el picasa foros:

    http://www.google.com/support/forum/p/Picasa/thread?tid=36ae553a7b49088e&hl=es

    @oedious escribió:- Esto va a ser
    un poco técnico, por lo que aferrarse.
    * El número encerrado en rect64() es una de 64-bit número hexadecimal.
    * Romper que en cuatro números de 16 bits.
    * Dividir cada uno por el máximo de 16 bits sin signo de número (65535) y tendrá
    cuatro números entre 0 y 1.
    * Los cuatro números restantes dar coordenadas relativas para la cara
    rectángulo: (izquierda, arriba, derecha, abajo).
    * Si usted desea terminar con coordenadas absolutas, múltiples la izquierda y
    derecho por el ancho de la imagen y la parte superior
    y abajo por la altura de la imagen.

    Este es un precioso vínculo. Gracias. Si has entendido mi pregunta, estoy tratando de romper la etiqueta img en las imgs. si tengo las coordenadas, yo podría escribir un plugin para Paint.net que hace esto(no tengo ninguna de programación de Escritorio experiencia, por lo que esto podría tomar meses, después de un enlace cuando su hecho:).)
    ¿Cómo puedo obtener la 16 bits de los números desde el uno de 64 bits?

    OriginalEl autor Joel Martinez

  2. 5

    Mirar OpenCV – uno de los ejemplos que viene con la distribución es para la detección de la cara.

    gracias voy a mirar en él
    Yo estaba buscando una biblioteca por un largo tiempo y parece que esto va a ayudar. Gracias por compartir.

    OriginalEl autor Paul R

  3. 5

    Su solución al problema es un exceso. Ignorar las caras. Lo que tienes es un sólido blanco de fondo y un montón de imágenes rectangulares. Todo lo que necesitas hacer es encontrar el rectángulo que encierra cada imagen y de los cultivos.

    Comience por ejecutar un filtro sobre la imagen original de la que se celebra todos los no-píxeles del fondo. Esto tomará un poco de ajuste porque, a veces, el fondo tendrá un toque de color en ella (la tierra) o el de la foto va a tener algunos píxeles que se parecen a las de fondo (en realidad, el blanco de los dientes).

    Ahora miran para grandes áreas con ningún color de fondo en ellos. Los cultivos aquellos en rectángulos.

    Ya que usted es el uno haciendo el escaneo, ¿por qué no hacer que el fondo verde? Verde podría ser más fácil que el color del filtro, especialmente desde que el pasaporte se toman fotos en un fondo blanco.

    +1 por hacer de mí la mirada en el problema en una luz diferente. Hacer un fondo verde será muy sencillo , estoy buscando el desarrollo de php de la webapp, que se ejecuta en un servidor local, que tendrá la etiqueta img de como cargar,a continuación, guardar el individuo fotos en el servidor y hacerlos disponibles como un zip para descargar. existen php libs (gd?) que me va a permitir detectar colores y seleccione rects?
    No sé si hay libs. Debe haber libs para cargar una imagen en proceso y de los colores en ella, sin embargo. Empezar con un filtro para el fondo, como el verde > 90%, rojo y azul, < 10%. A continuación, busque un continguous verde de la región que tiene orificios rectangulares en ella. (Descargar GIMP y jugar con la herramienta varita mágica para saber a qué me refiero.)Búsqueda para los bordes de los agujeros y se convierta en un rectángulo. La segunda parte es un poco más difícil, pero hay técnicas en.wikipedia.org/wiki/Hough_transform. Si usted sabe que los rectángulos están en ángulos rectos a los lados de la página de ayuda.
    He actualizado a la pregunta. con un script de php que recibe(?) la imagen de coordenadas. ¿Puedo usar para recortar imágenes individuales de la imagen?

    OriginalEl autor

  4. 2

    Puede simplificar el problema aún más 🙂 si las imágenes escaneadas siempre va a estar en un 5×4 cuadrícula … entonces usted puede fácilmente sólo tiene que abrir la imagen en casi cualquier lenguaje de programación que ofrece la manipulación de mapa de bits, y guardar cada cuadrado. He aquí un ejemplo de cómo hacerlo con C#:

    private Image Crop(Image pics, Rectangle area)
    {
       var bitmap = new Bitmap(pics);
       return (Image)bitmap.Clone(area, bitmap.PixelFormat);
    }

    Todo lo que tendríamos que hacer es calcular cada rectángulo y, a continuación, llamar a este método que devuelve el área de la imagen definida por el rectángulo. Algo como (posiblemente pseudo código, no he compilado el código de abajo):

    //assuming that each sub image in the larger is 45x65
    int cellwidth=45, cellheight=65;
    
    for(int row=0;row<5;row++)
    {
      for(int col=0;col<4;col++)
      {
        var rect = new Rectangle(
          row * cellwidth,
          col * cellheight,
          cellwidth,
          cellheight);
        var picture = Crop(bigPicture, rect);
        //then save the sub image with whatever naming convention you need
      }
    }
    Pero el pasaporte tamaño de la imagen varía mucho. algunos son de 5 cm por 4 cm, alrededor de 4 por 3 cm, 4×4, etc además de la colocación de ellos en el escáner crea azar arreglos como una regla. si podía detectar el etiquetado de las piezas de la imagen y, a continuación, recortar… puedo hacer un poco de php.
    He actualizado a la pregunta original, y su solución no parece plausible si pudiera tener las coordenadas. pero las coordenadas están en formato hexadecimal y entiendo nada acerca de hex,

    OriginalEl autor Joel Martinez

  5. 1

    Para el recorte de la parte, estoy escribiendo el código sin necesidad de pruebas, pero esto debería funcionar:

    <?php
    //source image
    $srcImg = "full/path/of/source/image.jpg";
    //output image
    $outImg = "full/path/to/result/image.jpg";
    
    //coordinates obtained from your calculation
    $p1 = array('X'=>371, 'Y'=>156);
    $p2 = array('X'=>468, 'Y'=>156);
    $p3 = array('X'=>468, 'Y'=>272);
    $p4 = array('X'=>371, 'Y'=>272);
    
    //let's calculate the parametres
    $srcX = $p1['X'];
    $srcY = $p1['Y'];
    $width = $p2['X'] - $p1['X'];
    $height = $p4['Y'] - $p1['Y'];
    
    //image processing
    $srcImg = imagecreatefromjpeg($srcImg);
    $dstImg = imagecreatetruecolor($width, $height);
    imagecopy($dstImg, $srcImg, 0, 0, $srcX, $srcY, $width, $height);
    imagejpeg($dstImg, $outImg, 100); //100 for highest quality, 0 for lowest quality
    imagedestroy($dstImg);
    ?>

    El código anterior se supone que la fuente de la imagen está en formato JPEG y las coordenadas hacer un perfecto rectángulo o cuadrado.

    Espero que ayude.

    gracias nirmal. yo estaba explorando el procesamiento de la imagen libs para php. Pulgares Para Arriba!
    Eres bienvenido. Me alegra ser de ayuda.

    OriginalEl autor

  6. 1

    Esto debe hacerse a través de la línea de meta. Aquí un poco de código para analizar el INI.

    <?php
    $vals = parseIni('picasa.ini');
    foreach($vals as $filename => $values) {
        $rects = getRects($values['faces']);
        foreach($rects as $rect) {
            printImageInfo($filename, $rect);
        }
    }
    
    /**
     * PHP's own parse_ini_file doesn't like the Picasa format.
     */
    function parseIni($file)
    {
        $index = 0;
        $vals = array();
        $f = fopen($file, 'r');
        while(!feof($f)) {
            $line = trim(fgets($f));
            if (preg_match('/^\[(.*?)\]$/', $line, $matches)) {
                $index = $matches[1];
                continue;
            }
    
            $parts = explode('=', $line, 2);
            if (count($parts) < 2) continue;
            $vals[$index][$parts[0]] = $parts[1];
        }
    
        fclose($f);
        return $vals;
    }
    
    function getRects($values)
    {
        $values = explode(';', $values);
        $rects = array();
        foreach($values as $rect) {
            if (preg_match('/^rect64\(([^)]+)\)/', $rect, $matches)) {
                $rects[] = $matches[1];
            }
        }
    
        return $rects;
    }
    
    function printImageInfo($filename, $rect)
    {
        $dim = getimagesize($filename);    
        $hex64=array();
        $hex64[]=substr($rect,0,4);
        $hex64[]=substr($rect,4,4);
        $hex64[]=substr($rect,8,4);
        $hex64[]=substr($rect,12,4);
        $width=$dim[0];
        $height=$dim[1];
        foreach($hex64 as $hex16){
            $dec=hexdec($hex16);
            $divide=65536;
            $mod=$dec%$divide;
            $result=$dec/$divide;
            $cordinate1=$result*$width;
            $cordinate2=$result*$height;
            echo "Remainder 1 : ".$mod." ; Result 1 :  ".$result."<br/>CO-ORDINATES : <B>".$cordinate1." ".$cordinate2."</B><br/>";
        }
    }

    OriginalEl autor

  7. 1

    He desarrollado una pequeña aplicación .NETA que hace exactamente lo que usted dijo, que produce los archivos de los rostros. Échale un vistazo aquí: http://ceottaki.com/devprojects/getpicasafaces

    El código fuente está disponible.

    Aunque yo no los he implementado obtener el nombre de los contactos de su código hexadecimal, es posible usar el Google API de Contactos: http://code.google.com/apis/contacts/

    Con que API es posible obtener contactos por ID, y si tus contactos están sincronizados entre Picasa y los Contactos de Google, el hexadecimal ID es el mismo.

    La última parte de un enlace de contacto es el hexadecimal utilizado por Picasa.

    Espero que esto ayude.

    Saludos,
    Felipe.

    Buen trabajo! No creo que acerca de los contactos de integración; que es un plus añadido. Dependiendo de Picasa para obtener el rect maleficios es doloroso, aunque. Desearía que hubiera una api para ti!

    OriginalEl autor

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea