首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于Picasa API的人脸自动检测

基于Picasa API的人脸自动检测
EN

Stack Overflow用户
提问于 2010-10-06 11:52:21
回答 7查看 12.5K关注 0票数 10

(已向超级用户提出类似的问题,询问与申请有关的答案。这个问题在这里发布是为了收集相同的可编程解决方案)

在我的工作地点,护照大小的照片一起扫描,然后切割成个别的照片,并保存与独特的文件号码。目前我们使用Paint.net手动选择、剪切和保存图片。

示例扫描文档PicasaScreen快照:(来自: google,多个来源,合理使用)

就像。在Picasa 3.8中,在点击View > People时,所有的脸都会显示出来,我被要求给它们命名,我能用不同的图片自动保存这些单独的图片吗?

更新的

我想要做的就是把上面的图片转换成单独的图片.

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

这些单独的面孔是我感兴趣的,如果我可以有协调,我可以从图片中裁剪所需的图像。

SAMPLE.jpg

ini含量

代码语言:javascript
运行
复制
 [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帮助站点用户的话技术人

@oedious写道:-这将有点技术性,所以请稍等。* rect64()中的数字是一个64位十六进制数。*把它分解成四个16位数。*除以最大无符号16位数(65535),在0到1之间将有四个数字。*剩下的四个数字给出了脸矩形的相对坐标:(左、上、右、下)。*如果您想以绝对坐标结束,请根据图像的宽度将左、右相乘,并按图像的高度将上、下相乘。

上面的引号谈到了rect64()中包含的数字,那么逗号后面括号外的数字呢?

我问了一个相关的问题。答案对你也有帮助。从64位十六进制值中获取四个16位数字

注意: ini细节与picasa为特定图像生成的内容相同。 此外,问题已经更新了多次,可能不够清楚。

Picasa帮助站点中有一些响应,我问了同样的问题,其中一个来自线程的答案,以获得基于ini文件中十六进制值的协调。下面的代码是来自帮助站点的C#中的esac代码。我可以在PHP中做同样的事情吗?

代码语言:javascript
运行
复制
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之间的数字

代码语言:javascript
运行
复制
<?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 CO-纵坐标: 371.99542236328 396.94633483887剩余1: 19598;结果1: 0.29904174804688 CO-纵坐标: 147.12854003906 156.99691772461余数1: 62471;结果1:0.29904174804688 CO-纵坐标: 468.99005126953 500.4467010498余数1: 34078;结果1:0.29904174804688 CO-坐标: 255.83459472656 272.99423217773

所以我也有协调器,@Nirmal有演示了如何裁剪它们。接下来的步骤是解析picasa.ini中的十六进制代码和文件名,并集成代码。Picasa目前并不通过api(或他们有吗?)提供十六进制代码。如果是这样的话,情况会更好。

因此,我们即将找到解决办法。谢谢大家,我希望我能把赏金分给每个人(我不能,但不要害怕,要注意你们的名声有多高!)

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-10-08 15:21:29

若要回答picasa问题,请参阅picasa论坛上的答复:

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

@oedious写道:-这将有点技术性,所以请稍等。* rect64()中的数字是一个64位十六进制数。*把它分解成四个16位数。*除以最大无符号16位数(65535),在0到1之间将有四个数字。*剩下的四个数字给出了脸矩形的相对坐标:(左、上、右、下)。*如果您想以绝对坐标结束,请根据图像的宽度将左、右相乘,并按图像的高度将上、下相乘。

票数 3
EN

Stack Overflow用户

发布于 2010-10-06 12:18:43

看看OpenCV --发行版附带的示例之一是用于人脸检测。

票数 5
EN

Stack Overflow用户

发布于 2010-10-13 10:25:47

你对这个问题的解决办法太过分了。别理他们的脸。你有一个坚实的白色背景和一堆矩形图像在上面。您所需要做的就是找到包含每个图像和裁剪的矩形。

首先,在标记所有非背景像素的原始图像上运行一个过滤器。这将需要一些调整,因为有时背景将有一点色调(污垢)或照片将有一些像素看起来像背景(真正的白色牙齿)。

现在你去找大面积的地方,里面没有背景色。把它们裁剪成矩形。

既然是你在扫描,为什么不让背景变绿呢?绿色可能是一种更容易过滤的颜色,特别是因为护照照片是在白色背景下拍摄的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3872112

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档