(已向超级用户提出类似的问题,询问与申请有关的答案。这个问题在这里发布是为了收集相同的可编程解决方案)
在我的工作地点,护照大小的照片一起扫描,然后切割成个别的照片,并保存与独特的文件号码。目前我们使用Paint.net手动选择、剪切和保存图片。
示例扫描文档PicasaScreen快照:(来自: google,多个来源,合理使用)

就像。在Picasa 3.8中,在点击View > People时,所有的脸都会显示出来,我被要求给它们命名,我能用不同的图片自动保存这些单独的图片吗?
更新的
我想要做的就是把上面的图片转换成单独的图片.
在上面的图像中,我展示了Picasa 3.8如何检测图像并提示我命名它们。我不需要人脸识别,我只是需要人脸检测。Picasa检测单个图像并在RHS上显示它们。这些单独的图片是我需要的。Picasa创建一个.ini文件,该文件保存十六进制值,其中包含各个面的协调。
这些单独的面孔是我感兴趣的,如果我可以有协调,我可以从图片中裁剪所需的图像。
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帮助站点用户的话技术人说
@oedious写道:-这将有点技术性,所以请稍等。* rect64()中的数字是一个64位十六进制数。*把它分解成四个16位数。*除以最大无符号16位数(65535),在0到1之间将有四个数字。*剩下的四个数字给出了脸矩形的相对坐标:(左、上、右、下)。*如果您想以绝对坐标结束,请根据图像的宽度将左、右相乘,并按图像的高度将上、下相乘。
上面的引号谈到了rect64()中包含的数字,那么逗号后面括号外的数字呢?
我问了一个相关的问题。答案对你也有帮助。从64位十六进制值中获取四个16位数字
注意: ini细节与picasa为特定图像生成的内容相同。 此外,问题已经更新了多次,可能不够清楚。
在Picasa帮助站点中有一些响应,我问了同样的问题,其中一个来自线程的答案,以获得基于ini文件中十六进制值的协调。下面的代码是来自帮助站点的C#中的esac代码。我可以在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
$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(或他们有吗?)提供十六进制代码。如果是这样的话,情况会更好。
因此,我们即将找到解决办法。谢谢大家,我希望我能把赏金分给每个人(我不能,但不要害怕,要注意你们的名声有多高!)
发布于 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之间将有四个数字。*剩下的四个数字给出了脸矩形的相对坐标:(左、上、右、下)。*如果您想以绝对坐标结束,请根据图像的宽度将左、右相乘,并按图像的高度将上、下相乘。
发布于 2010-10-06 12:18:43
看看OpenCV --发行版附带的示例之一是用于人脸检测。
发布于 2010-10-13 10:25:47
你对这个问题的解决办法太过分了。别理他们的脸。你有一个坚实的白色背景和一堆矩形图像在上面。您所需要做的就是找到包含每个图像和裁剪的矩形。
首先,在标记所有非背景像素的原始图像上运行一个过滤器。这将需要一些调整,因为有时背景将有一点色调(污垢)或照片将有一些像素看起来像背景(真正的白色牙齿)。
现在你去找大面积的地方,里面没有背景色。把它们裁剪成矩形。
既然是你在扫描,为什么不让背景变绿呢?绿色可能是一种更容易过滤的颜色,特别是因为护照照片是在白色背景下拍摄的。
https://stackoverflow.com/questions/3872112
复制相似问题