使用 Picasa API 进行自动人脸检测以提取单个图像 [英] Automatic face detection using Picasa API to extract individual images

查看:25
本文介绍了使用 Picasa API 进行自动人脸检测以提取单个图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

(已经在超级用户上提出了一个类似的问题,以获得与应用程序相关的答案.发布该问题是为了收集相同的可编程解决方案)

在我的工作场所,护照尺寸的照片被一起扫描,然后切割成单独的照片并以唯一的文件编号保存.目前我们使用Paint.net来手动选择、剪切和保存图片.

At my work place, passport sized photographs are scanned together, then cut up into individual pictures and saved with unique file numbers. Currently we use Paint.net to manually select, cut and save the pictures.

扫描文档 Picasa 屏幕截图示例:(来自:google image search multiple source,fairuse)

Sample Scanned Document Picasa Screenshot: (from: google image search multiple sources, fairuse)

例如.在 Picasa 3.8 中,单击查看">人物"时,会显示所有面孔并要求我为它们命名,我可以将这些单独的图片自动保存为不同的图片吗?

For eg. In Picasa 3.8, On clicking View > People, all the faces are shown and I am asked to name them, can I save these individual pictures automatically with the names as different pictures?

更新

我要做的就是将上面的图片转换为单张图片.

在上图中,我展示了 Picasa 3.8 如何检测图像并提示我为它们命名.我不需要人脸识别,我只需要人脸检测.Picasa 检测单个图像并将它们显示在 RHS 上.这些单独的图像正是我所需要的.Picasa 创建一个 .ini 文件,用于保存包含各个面的坐标的十六进制值.

In the image above, I have shown how Picasa 3.8 detects the images and prompts me to name them. I do not need face recognition, I simply need face detection. Picasa detects the individual images and shows them on the RHS. These individual images are what I need. Picasa creates a .ini file which saves the hex values which contains the co-ordinates of the individual faces.

这些人脸正是我感兴趣的如果我能有坐标,我就可以从图片中裁剪出所需的图像.

SAMPLE.jpg

ini 内容

 [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

*ini 文件似乎将每个标签的面部标签坐标保存为 rect64(534a06d429ae627),dff6163dfd9d4e41.引用自 Picasa 帮助网站用户Technonath

*The ini file seems to be saving the co-ordinates of the face tags as rect64(534a06d429ae627),dff6163dfd9d4e41 for each tag. Quoting from Picasa Help Site user Technonath says

@oedious 写道:- 这将是有点技术性,所以坚持下去.* rect64() 中包含的数字是一个 64 位的十六进制数.* 将其分解为四个 16 位数字.* 将每个除以最大的无符号 16 位数字 (65535),您将得到0 到 1 之间的四个数字.* 剩下的四个数字为您提供面部的相对坐标矩形:(左,上,右,下).* 如果您想以绝对坐标结束,请乘以左和就在图像宽度和顶部和底部按图像高度.

@oedious wrote:- This is going to be somewhat technical, so hang on. * The number encased in rect64() is a 64-bit hexadecimal number. * Break that up into four 16-bit numbers. * Divide each by the maximum unsigned 16-bit number (65535) and you'll have four numbers between 0 and 1. * The four numbers remaining give you relative coordinates for the face rectangle: (left, top, right, bottom). * If you want to end up with absolute coordinates, multiple the left and right by the image width and the top and bottom by the image height.

上面引用的内容是关于 rect64() 中包含的数字,逗号后面括号外的数字呢?

The above quote talks about the number encased in rect64() what about the number outside the parentheses after the comma?

我问了一个相关的问题.其中的答案也可能对您有所帮助.从 64 位十六进制值中获取四个 16 位数字

I have asked a related question. Answers of which may help you too. Get four 16bit numbers from a 64bit hex value

注意:ini 细节与 picasa 相同为特定图像生成.

Note: The ini details are the same which picasa generated for the particular image.

另外这个问题已经更新了多次,可能不够清楚.

Plus the question has been updated multiple times and may not be clear enough.

Picasa 中有一些回复帮助网站,我在那里问了同样的问题该线程的答案之一是根据 ini 文件中的十六进制值获取坐标.以下代码来自 esac 来自帮助站点.我可以在 PHP 中做同样的事情吗?

There are some responses at the Picasa Help site, where I asked the same question One of the answers from that thread to get co-ordinates based on the hex values from the ini file. The following code is in C# from esac from the help site. Can I do the same in 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);
} 

PHP 代码 试图将 64 位转换为 1 到 0 之间的数字

PHP code trying to convert 64bit to numbers between 1 and 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/>";
}
?>

输出

余数 1 : 49551 ;结果 1:0.75608825683594 坐标:371.99542236328 396.94633483887 余数 1:19598;结果 1:0.29904174804688 坐标:147.12854003906 156.99691772461 余数 1:62471;结果 1:0.95323181152344 坐标:468.99005126953 500.4467010498 余数 1:34078;结果 1:0.51998901367188 坐标:255.83459472656 272.99423217773

Remainder 1 : 49551 ; Result 1 : 0.75608825683594 CO-ORDINATES : 371.99542236328 396.94633483887 Remainder 1 : 19598 ; Result 1 : 0.29904174804688 CO-ORDINATES : 147.12854003906 156.99691772461 Remainder 1 : 62471 ; Result 1 : 0.95323181152344 CO-ORDINATES : 468.99005126953 500.4467010498 Remainder 1 : 34078 ; Result 1 : 0.51998901367188 CO-ORDINATES : 255.83459472656 272.99423217773

所以我也有坐标,@Nirmal 有 展示了如何裁剪它们.现在下一步是解析 picasa.ini 的十六进制代码和文件名并集成代码.Picasa 目前不通过 api(或 他们是吗?)提供十六进制代码.如果是这样,事情会更好.

So I have the co-ordinates too and @Nirmal has shown how to crop them. Now next steps would be to parse picasa.ini for the hex codes and file names and integrate the code. Picasa doesn't currently provide the hex codes via a api(or Do they?). If that were the case, things would have been better.

所以我们正在接近解决方案.谢谢大家,我希望我能把赏金奖励给每个人(我不能,但不要害怕,注意你的代表人数激增!)

So we are nearing a solution. Thank you all, I wish I could award the bounty to everyone(I cannot, but fear not and look out for a spike in your rep!)

推荐答案

要回答 picasa 问题,请参阅 picasa 论坛上的此回复:
http://www.google.com/support/forum/p/Picasa/thread?tid=36ae553a7b49088e&hl=en

To answer the picasa question, see this response on the picasa forums:
http://www.google.com/support/forum/p/Picasa/thread?tid=36ae553a7b49088e&hl=en

@oedious 写道:- 这将是有点技术性,所以坚持下去.* rect64() 中包含的数字是一个 64 位的十六进制数.* 将其分解为四个 16 位数字.* 将每个除以最大的 16 位无符号数 (65535),您将得到0 到 1 之间的四个数字.* 剩下的四个数字为您提供面部的相对坐标矩形:(左,上,右,下).* 如果你想以绝对坐标结束,乘以左和就在图像宽度和顶部和底部按图像高度.

@oedious wrote:- This is going to be somewhat technical, so hang on. * The number encased in rect64() is a 64-bit hexadecimal number. * Break that up into four 16-bit numbers. * Divide each by the maximum unsigned 16-bit number (65535) and you'll have four numbers between 0 and 1. * The four numbers remaining give you relative coordinates for the face rectangle: (left, top, right, bottom). * If you want to end up with absolute coordinates, multiple the left and right by the image width and the top and bottom by the image height.

这篇关于使用 Picasa API 进行自动人脸检测以提取单个图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆