700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > php opencv 人脸识别 基于OpenCV的PHP图像人脸识别技术

php opencv 人脸识别 基于OpenCV的PHP图像人脸识别技术

时间:2022-11-03 22:52:06

相关推荐

php opencv 人脸识别 基于OpenCV的PHP图像人脸识别技术

本文所介绍的技术不是原创,而是从一个叫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)

下载地址:/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

下载地址/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 扩展,请参考:

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=newImagick($img);

//$draw=newImagickDraw();

//$borderColor=newImagickPixel(’red’);

//$draw->setFillAlpha(0.0);

//$draw->setStrokeColor($borderColor);

//$draw->setStrokeWidth(1);

if(is_array($all)){

foreach($allas$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{

?>

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

上传一张图片

}

?>

使用测试

安装测试了一下,如果越是高清的大图,效果越明显,感觉不错

一 安装

1 安装opencv

/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 /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)) {

?>

上传图片:

} 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.”

”;

// echo $dst_pic.”

”;

$cmd = “/usr/bin/convert -crop “.$w.”x”.$h.”+”.$x.”+”.$y.” “.$src_pic.” “.$dst_pic;

// echo $cmd.”

”;

echo `$cmd`;

$pic_src[] = “upload/”.$tmp_name.$fix_pic;

$pic_dst[] = “upload/”.$tmp_name_new.$fix_pic;

}

}

foreach($pic_src as $key => $value) {

echo “ =>

”;

}

}

?>

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。