Frage

(Eine ähnliche Frage wird nach Antworten auf Super-User gefragt worden, im Zusammenhang mit Anwendungen. Die Frage ist hier gebucht programmierbare Lösungen für das gleiche sammeln)

An meinem Arbeitsplatz, Größe Passfotos zusammen überprüft werden, dann in einzelne Bilder zerschnitten und gespeichert mit eindeutigen Dateinummern. Derzeit verwenden wir Paint.net manuell auswählen, schneiden und die Bilder gespeichert werden.

Beispiel gescanntes Dokument Picasa Screenshot: (Aus: Google Bild mehreren Quellen suchen, FairUse)

picasa Screenshot

Für zB. In Picasa 3.8 Auf klicken Ansicht> Menschen, alle Gesichter gezeigt, und ich bat sie, zu nennen, kann ich speichern diese einzelnen Bilder automatisch mit den Namen wie verschiedene Bilder?

Aktualisiert

Alles, was ich will, ist das Bild oben auf einzelne Bilder konvertieren tun.

Im Bild oben, ich habe gezeigt, wie Picasa 3.8 erkennt die Bilder und fordert mich auf, sie zu benennen. Ich glaube nicht, Gesichtserkennung braucht, ich muß einfach nur die Gesichtserkennung. Picasa erkennt die einzelnen Bilder und zeigt sie auf der RHS. Diese einzelnen Bilder sind das, was ich brauche. Picasa erstellt eine INI-Datei, die die Hex-Werte speichert, die die Koordinaten der einzelnen Flächen enthält.

Diese einzelnen Gesichter sind das, was mich interessiert, wenn ich die Koordinaten haben, kann ich die gewünschten Bilder aus dem Bild zuschneiden können.

SAMPLE.jpg

sample.jpg

ini Inhalte

 [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

* Die INI-Datei scheint für jeden Tag, um die Koordinaten des Gesicht Tags als rect64(534a06d429ae627),dff6163dfd9d4e41 zu speichern. Zitiert von Picasa-Hilfe-Site Benutzer Technonath sagt

  

@oedious schrieb: - Das wird sein   etwas technisch, hängen so weiter.   * Die Zahl in rect64 ummantelt () ist eine 64-Bit-Hexadezimal-Zahl.   * Dass in vier 16-Bit-Zahl Break up.   * Teilen Sie die jeweils durch die maximale unsigned 16-Bit-Nummer (65535) und Sie haben   vier Zahlen zwischen 0 und 1.   * Die vier Zahlen, die Sie für das Gesicht relativen Koordinaten verbleibenden geben   Rechteck: (links, oben, rechts, unten).   * Wenn Sie mit absoluten Koordinaten wollen am Ende, mehrere links und   rechts von der Bildbreite und den oberen   und unten durch die Bildhöhe.

Das obige Zitat spricht über die Zahl in rect64 eingeschlossen (), was über die Zahl außerhalb der Klammern nach dem Komma?

Ich habe eine ähnliche Frage gestellt. Antworten, von denen Sie können auch helfen. Get vier 16-Bit-Zahlen von einem 64-Bit-Hex-Wert

  

Hinweis: Die   ini Details sind gleich welche picasa   erzeugt für das jeweilige Bild.

     

Plus die Frage wurde mehrfach aktualisiert und kann nicht klar genug sein.

Es gibt einige Antworten auf die Picasa-Hilfe-Website , wo ich die gleiche Frage gestellt Eine der Antworten aus diesem Thread Koordinaten zu erhalten, basierend auf den Hex-Werten aus der INI-Datei. Der folgende Code ist in C # von esac von der Hilfe-Website. Kann ich das gleiche in PHP zu tun?

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);
} 

PHP-Code versuchen, convert 64-Bit-Zahlen zwischen 1 und 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/>";
}
?>

Die Ausgabe

  

Rest 1: 49551; Ergebnis 1:   0,75608825683594 Koordinaten: 371,99542236328 396,94633483887 Rest 1: 19598; Ergebnis 1:   0,29904174804688 Koordinaten: 147,12854003906 156,99691772461 Rest 1: 62471; Ergebnis 1:   0,95323181152344 Koordinaten: 468,99005126953 500,4467010498 Rest 1: 34078; Ergebnis 1:   ,51998901367188 Koordiniert: 255,83459472656 272,99423217773

So habe ich die Koordinaten zu und @Nirmal hat gezeigt, wie sie zuzuschneiden. Es wäre jetzt die nächsten Schritte picasa.ini für die Hex-Codes und Dateinamen und integrieren Sie den Code zu analysieren. Picasa derzeit nicht die über eine api Hex-Codes zur Verfügung stellen (oder Do sie? ). Wenn das der Fall wäre, hätten die Dinge besser gewesen.

So nähern wir eine Lösung. Vielen Dank an alle, ich wünschte, ich könnte die Prämie an alle vergeben (ich kann nicht, aber fürchtet euch nicht und halten Sie Ausschau nach einem sprunghaften Anstieg in Ihrem rep!) ??

War es hilfreich?

Lösung

die picasa Frage zu beantworten, sehen diese Antwort auf die picasa Foren:
http://www.google.com/support/forum / p / Picasa / Thread? tid = 36ae553a7b49088e & hl = en

  

@oedious schrieb: - Das wird sein   etwas technisch, hängen so weiter.   * Die Zahl in rect64 ummantelt () ist eine 64-Bit-Hexadezimal-Zahl.   * Dass in vier 16-Bit-Zahl Break up.   * Teilen Sie die jeweils durch die maximale unsigned 16-Bit-Nummer (65535) und Sie haben   vier Zahlen zwischen 0 und 1.   * Die vier Zahlen, die Sie für das Gesicht relativen Koordinaten verbleibenden geben   Rechteck: (links, oben, rechts, unten).   * Wenn Sie mit absoluten Koordinaten wollen am Ende, mehrere links und   rechts von der Bildbreite und den oberen   und unten durch die Bildhöhe.

Andere Tipps

Lesen Sie OpenCV - eines der Beispiele, die mit der Verteilung kommt, ist für die Gesichtserkennung <. / p>

Ihre Lösung für das Problem ist übertrieben. Ignorieren Sie die Gesichter. Was Sie haben, ist ein solider weißer Hintergrund und ein Bündel von rechteckigen Bildern drauf. Alles, was Sie tun müssen, ist das Rechteck finden, die jedes Bild und Ernte umschließt.

Starten Sie durch einen Filter über das Originalbild ausgeführt wird, dass markiert alle Nicht-Hintergrundpixel. Dies wird einigen Tuning, weil manchmal der Hintergrund einen Hauch von Tönung darin hat (Schmutz) oder das Foto wird einige Pixel hat, die aussehen wie der Hintergrund (wirklich weißen Zähne).

Jetzt schauen Sie für große Flächen ohne Hintergrundfarbe in ihnen. Crop diejenigen in Rechtecke.

Da Sie sind derjenige, der das Scannen zu tun, warum nicht den Hintergrund grün machen? Grün könnte ein einfacher Farbfilter sein, zumal die Passfotos auf einem weißen Hintergrund getroffen werden.

Sie können das Problem vereinfachen weiter :-) wenn die gescannten Bilder immer in einem 5x4 Raster sein wird ... dann können Sie leicht öffnen Sie einfach das Bild in fast jeder Programmiersprache, die Angebote Bitmap-Manipulation, und speichern Sie jedes Quadrat. Hier ist ein Beispiel dafür, wie dies mit C # zu tun:

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

Alles, was Sie brauchen würde, zu tun ist, jedes Rechteck zu berechnen, und dann diese Methode aufrufen, die Renditen nur der Bereich des Bildes durch das Rechteck definiert. So etwas wie (möglicherweise Pseudo-Code, nicht den Code kompiliert):

// 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
  }
}

Für das Zuschneiden Teil, ich den Code tippe ohne Prüfung, aber dies sollte funktionieren:

<?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);
?>

Der obige Code wird davon ausgegangen, dass Ihr Quellbild im JPEG-Format ist und die Koordinaten sind ein perfektes Rechteck oder Quadrat.

Ich hoffe, das hilft.

Das sollten Sie über die Ziellinie bekommen. Hier einige Code, um die INI zu analysieren.

<?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/>";
    }
}

Ich habe eine kleine app in .NET entwickelt, das genau das tut, was Sie gesagt haben, erzeugt er die Dateien für die Gesichter. Check it out hier: http://ceottaki.com/devprojects/getpicasafaces

Der Quellcode ist ebenfalls verfügbar.

Während ich nicht umgesetzt haben, den Namen der Kontakte aus ihren Hexadezimal-Code bekommen, ist es möglich, die Google-Kontakte-API: http://code.google.com/apis/contacts/

Mit dieser API ist es möglich, Kontakte von ID zu bekommen, und wenn Sie Ihre Kontakte synchronisiert werden zwischen Picasa und Google-Kontakte, die hexadezimale ID ist die gleiche.

Der letzte Teil einer vollständigen Kontaktverbindung ist die hexadezimale, die von Picasa.

Ich hoffe, das hilft.

Cheers, Felipe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top