日期:2014-05-17  浏览次数:20458 次

OpenCV和PHP的人脸识别技术
OpenCV安装之前必须依赖的包:(请先安装好)
pkgconfig
libpng
zlib
libjpeg
libtiff
python

[OpenCV安装] www.opencv.org.
tar xvzf OpenCV-1.0.0.tar.gz
cd opencv-1.0.0
./configure
make
make install
make check (检查是否安装全部正确)

[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
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test
make install

[ImageMagick] http://www.imagemagick.org/
tar jxvf ImageMagick-6.5.0-0.tar.bz2
cd ImageMagick-6.5.0-0
./configure
make
make install

[imagick] http://pecl.php.net/imagick
tar zxvf imagick-2.3.0b1.tgz
imagick-2.3.0b1
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make test
make install


[配置]
ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/
看看有没有 facedetect.so 和 imagick.so
vi /usr/local/php/lib/php.ini
在[PHP]模块下增加:
extension = facedetect.so
extension = imagick.so
重启apache


[测试代码]


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





//------------------


// 人脸扭曲


//------------------


<?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 =new ImagickDraw();


//$borderColor = new ImagickPixel('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{


?>


<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


<form method="POST" enctype="multipart/form-data">


人脸识别试验:只支持jpg,png<br>


上传一张图片 <input type="file" name="pic">


<input type="submit" value="upload">


</form>


<?


}


?>








//------------------


// 人脸识别


//------------------


<?php


header("Content-Type:text/html; charset:utf-8");


if(empty($_POST)) {


?>


<html>


<head>


<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">


<title>人脸识别</title>


</head>


<body>


<h2>人脸识别</h2>


PS: 请上传一张带有人脸的图片<br />


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


</body>


</html>


<?php


} 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 = "./".$tmp_name.$fix_pic;


move_uploaded_file($_FILES['pic']['tmp_name'], $src_pic);





$pic_src = $pic_dst =