本文所介绍的技术不是原创,而是从一个叫Robert Eisele的德国人那里学习来的。他写了一个PHP扩展openCV,只封装了两个函数,叫face_detect和face_count。 openCV是一个开源的用C/C++开发的计算机图形图像库,非常强大,研究资料很齐全。本文重点是介绍如何使用php来调用其中的局部的功能。人脸侦查技术只是openCV一个应用分支。
OpenCV安装之前必须依赖的包:(请先安装好)
pkgconfig
libpng
zlib
libjpeg
libtiff
python
1.安装
从源代码编译成一个动态的so文件。
1.1.安装 OpenCV (OpenCV 1.0.0)
下载地址:http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948
#tar xvzf OpenCV-1.0.0.tar.gz
#cd opencv-1.0.0
#./configure
#make
#make install
#make check (检查是否安装全部正确)
提示: 不要指定安装路径,否则后面编译facedetect会找不到OpenCV的路径。
1.2 安装facedetect
下载地址http://www.xarg.org/download/facedetect-1.0.0.tar.gz
#tar xzvf facedetect-1.0.0.tar.gz
#cd facedetect-1.0.0
#phpize && ./configure && make && make install
编译完之后会提示facedetect.so 文件所在的位置。
最后确认在php.ini加入
extension=facedetect.so,重启apache.
2.函数使用
在phpinfo()里检查是否有facedetect这个模块。
从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下
- //检查有多少个脸型
- var_dump(face_count( 'party.jpeg' ,haarcascade_frontalface_alt.xml'));
- //返回脸型在图片中的位置参数,多个则返回数组
- $arr =face_detect( 'party.jpeg' ,haarcascade_frontalface_alt2.xml');
- print_r( $arr );
3.应用
结合imagick可以将图片做一下应用。因为 face_detect只返回一个矩形参数,包含x,y坐标和w,h长宽参数。下面是我的一个应用demo
imagick 扩展需要安装 ImageMagick 和 imagick 扩展,请参考:
ImageMagick官网: http://www.imagemagick.org
imagick扩展下载: http://pecl.php.net/package/imagick
- <?php
- if ( $_FILES ){
- $img = $_FILES [ 'pic' ][ 'tmp_name' ];
- $arr =face_detect( $img , 'haarcascade_frontalface_alt2.xml' );
- //$arr1=face_detect($img,'haarcascade_frontalface_alt_tree.xml');
- if ( is_array ( $arr1 )) $all = array_merge ( $arr , $arr1 );
- else $all = $arr ;
- $im = new Imagick( $img );
- //$draw=newImagickDraw();
- //$borderColor=newImagickPixel('red');
- //$draw->setFillAlpha(0.0);
- //$draw->setStrokeColor($borderColor);
- //$draw->setStrokeWidth(1);
- if ( is_array ( $all )){
- foreach ( $all as $v ){
- $im_cl = $im ->clone();
- $im_cl ->cropImage( $v [ 'w' ], $v [ 'h' ], $v [ 'x' ], $v [ 'y' ]);
- $im_cl ->swirlImage(60);
- $im ->compositeImage( $im_cl ,Imagick::COMPOSITE_OVER, $v [ 'x' ], $v [ 'y' ]);
- //$draw->rectangle($v['x'],$v['y'],$v['x']+$v['w'],$v['y']+$v['h']);
- //$im->drawimage($draw);
- }
- }
- header( "Content-Type:image/png" );
- echo $im ;
- } else {
- ?>
- <metahttp-equiv= "Content-Type" content= "text/html;charset=utf-8" />
- <formmethod= "POST" enctype= "multipart/form-data" >
- 人脸识别试验:只支持jpg,png<br>
- 上传一张图片<inputtype= "file" name= "pic" >
- <inputtype= "submit" value= "upload" >
- </form>
- <?
- }
- ?>
参考资料:
http://www.xarg.org/2008/07/face-detection-with-php/
http://www.opencv.org.cn/index.php/首页
http://www.cs.iit.edu/~agam/cs512/lect-notes/opencv-intro/index.html
以上文章来源: http://blog.csdn.net/zhongmao/archive/2009/01/11/3753377.aspx
使用测试
安装测试了一下,如果越是高清的大图,效果越明显,感觉不错
一 安装
1 安装opencv
http://sourceforge.net/project/showfiles.php?group_id=22870&package_id=16948
下载opencv-1.1pre1.tar.gz(1.0版本没有安装成功)
#tar zxvf opencv-1.1pre1.tar.gz
# cd opencv-1.1.0/
# /.configure
#make
#make install
2 安装facedetect
#wget http://www.xarg.org/download/facedetect-1.0.0.tar.gz
#tar xzvf facedetect-1.0.0.tar.gz
#cd facedetect-1.0.0
#/usr/local/php/bin/phpize
#./configure –with-php-config=/usr/local/php/bin/php-config
#make
#make install
#vi /usr/local/php/etc/php.ini
// 增加extension=facedetect.so
3 重启web服务器,在phpinfo()里查看是否有facedetect这个模块
二 简单测试
从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下
//检查有多少个脸型
var_dump(face_count(’test.jpg’, ‘haarcascade_frontalface_alt.xml’));
//返回脸型在图片中的位置参数,多个则返回数组
$arr = face_detect(’test.jpg’, ‘haarcascade_frontalface_alt2.xml’);
print_r($arr);
三 测试代码
<?
if(empty($_POST)) {
?>
<form name=”form” id=”form” method=”POST” enctype=”multipart/form-data” action=”">
上传图片:<input type=”file” name=”pic” size=”20″><input type=”submit” name=”submit” value=”上传”>
</form>
<?
} else {
$img = $_FILES['pic']['tmp_name'];
$arr = face_detect($img, ‘haarcascade_frontalface_alt2.xml’);
if(is_array($arr1)) {
$all = array_merge($arr,$arr1);
} else {
$all = $arr;
}
$allowtype = 1;
switch($_FILES['pic']['type']){
case ‘image/pjpeg’: $fix_pic.= “.jpg”; break;
case ‘image/jpeg’: $fix_pic.= “.jpg”; break;
case ‘image/x-png’: $fix_pic.= “.png”; break;
case ‘image/png’: $fix_pic.= “.png”; break;
default: $allowtype = 0; break;
}
if($allowtype == 0) {
echo “文件格式错误:只运行jpg或png图片”;exit;
}
$tmp_name = time();
$src_pic = “/usr/website/nginx/face/haarcascades/upload/”.$tmp_name.$fix_pic;
move_uploaded_file($_FILES['pic']['tmp_name'], $src_pic);
$pic_src = $pic_dst = array();
if(is_array($all)){
foreach ($all as $k => $v){
$tmp_name_new = $tmp_name.”_”.$k;
$x = $v['x'];
$y = $v['y'];
$w = $v['w'];
$h = $v['h'];
$dst_pic = “/usr/website/nginx/face/haarcascades/upload/”.$tmp_name_new.$fix_pic;
// echo $src_pic.”<br>”;
// echo $dst_pic.”<br>”;
$cmd = “/usr/bin/convert -crop “.$w.”x”.$h.”+”.$x.”+”.$y.” “.$src_pic.” “.$dst_pic;
// echo $cmd.”<br>”;
echo `$cmd`;
$pic_src[] = “upload/”.$tmp_name.$fix_pic;
$pic_dst[] = “upload/”.$tmp_name_new.$fix_pic;
}
}
foreach($pic_src as $key => $value) {
echo “<img src=’”.$value.”‘> => <img src=’”.$pic_dst[$key].”‘><br>”;
}
}
?>
以上文章来源: http://www.sysbus.com/?p=124