OpenCV和PHP的人脸识别技术

来源:互联网 发布:淘宝卖家评价模板 编辑:程序博客网 时间:2024/05/21 13:25
Php代码  收藏代码
  1. OpenCV安装之前必须依赖的包:(请先安装好)  
  2. pkgconfig  
  3. libpng  
  4. zlib  
  5. libjpeg  
  6. libtiff  
  7. python  
  8.   
  9. [OpenCV安装] www.opencv.org.  
  10. tar xvzf OpenCV-1.0.0.tar.gz  
  11. cd opencv-1.0.0  
  12. ./configure  
  13. make  
  14. make install  
  15. make check (检查是否安装全部正确)  
  16.   
  17. [facedetect] http://www.xarg.org/download/facedetect-1.0.0.tar.gz  
  18. tar xzvf facedetect-1.0.0.tar.gz  
  19. cd facedetect-1.0.0  
  20. /usr/local/php/bin/phpize  
  21. ./configure --with-php-config=/usr/local/php/bin/php-config  
  22. make  
  23. make test  
  24. make install  
  25.   
  26. [ImageMagick] http://www.imagemagick.org/  
  27. tar jxvf ImageMagick-6.5.0-0.tar.bz2  
  28. cd ImageMagick-6.5.0-0  
  29. ./configure  
  30. make  
  31. make install  
  32.   
  33. [imagick] http://pecl.php.net/imagick  
  34. tar zxvf imagick-2.3.0b1.tgz  
  35. imagick-2.3.0b1  
  36. /usr/local/php/bin/phpize  
  37. ./configure --with-php-config=/usr/local/php/bin/php-config  
  38. make  
  39. make test  
  40. make install  
  41.   
  42.   
  43. [配置]  
  44. ll /usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/  
  45. 看看有没有 facedetect.so 和 imagick.so  
  46. vi /usr/local/php/lib/php.ini  
  47. 在[PHP]模块下增加:  
  48. extension = facedetect.so  
  49. extension = imagick.so  
  50. 重启apache  
  51.   
  52.   
  53. [测试代码]  
  54.   
  55.   
  56. 从openCV源代码/data/haarcascades/里头取出所有xml文件放在php的执行目录下  
  57.   
  58.   
  59.   
  60.   
  61.   
  62. //------------------  
  63.   
  64.   
  65. // 监测有几个人脸  
  66.   
  67.   
  68. //------------------  
  69.   
  70.   
  71. //检查有多少个脸型  
  72.   
  73.   
  74. var_dump(face_count('party.jpeg', haarcascade_frontalface_alt.xml'));  
  75.   
  76.   
  77. //返回脸型在图片中的位置参数,多个则返回数组  
  78.   
  79.   
  80. $arr = face_detect('party.jpeg', haarcascade_frontalface_alt2.xml');  
  81.   
  82.   
  83. print_r($arr);  
  84.   
  85.   
  86.   
  87.   
  88.   
  89. //------------------  
  90.   
  91.   
  92. // 人脸扭曲  
  93.   
  94.   
  95. //------------------  
  96.   
  97.   
  98. <?php  
  99.   
  100.   
  101. if($_FILES){  
  102.   
  103.   
  104. $img = $_FILES['pic']['tmp_name'];  
  105.   
  106.   
  107. $arr = face_detect($img'haarcascade_frontalface_alt2.xml');  
  108.   
  109.   
  110. //$arr1 = face_detect($img, 'haarcascade_frontalface_alt_tree.xml');  
  111.   
  112.   
  113. if(is_array($arr1)) $all =array_merge($arr,$arr1);  
  114.   
  115.   
  116. else $all = $arr;  
  117.   
  118.   
  119. $im = new Imagick($img);  
  120.   
  121.   
  122. //$draw =new ImagickDraw();  
  123.   
  124.   
  125. //$borderColor = new ImagickPixel('red');  
  126.   
  127.   
  128. //$draw->setFillAlpha(0.0);  
  129.   
  130.   
  131. //$draw->setStrokeColor ($borderColor);  
  132.   
  133.   
  134. //$draw->setStrokeWidth (1);  
  135.   
  136.   
  137. if(is_array($all)){  
  138.   
  139.   
  140. foreach ($all as $v){  
  141.   
  142.   
  143.     $im_cl = $im->clone();  
  144.   
  145.   
  146.     $im_cl->cropImage($v['w'],$v['h'],$v['x'],$v['y']);  
  147.   
  148.   
  149.       
  150.   
  151.   
  152.     $im_cl->swirlImage(60);  
  153.   
  154.   
  155.     $im->compositeImage( $im_cl, Imagick::COMPOSITE_OVER , $v['x'], $v['y'] );  
  156.   
  157.   
  158.       
  159.   
  160.   
  161.     //$draw->rectangle($v['x'],$v['y'],$v['x']+$v['w'],$v['y']+$v['h']);  
  162.   
  163.   
  164.     //$im->drawimage($draw);  
  165.   
  166.   
  167.       
  168.   
  169.   
  170.       
  171.   
  172.   
  173. }  
  174.   
  175.   
  176. }  
  177.   
  178.   
  179. header( "Content-Type: image/png" );  
  180.   
  181.   
  182. echo $im;  
  183.   
  184.   
  185. }else{  
  186.   
  187.   
  188. ?>  
  189.   
  190.   
  191. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  192.   
  193.   
  194. <form method="POST" enctype="multipart/form-data">  
  195.   
  196.   
  197. 人脸识别试验:只支持jpg,png<br>  
  198.   
  199.   
  200. 上传一张图片 <input type="file" name="pic">  
  201.   
  202.   
  203. <input type="submit" value="upload">  
  204.   
  205.   
  206. </form>  
  207.   
  208.   
  209. <?  
  210.   
  211.   
  212. }  
  213.   
  214.   
  215. ?>  
  216.   
  217.   
  218.   
  219.   
  220.   
  221.   
  222.   
  223.   
  224. //------------------  
  225.   
  226.   
  227. // 人脸识别  
  228.   
  229.   
  230. //------------------  
  231.   
  232.   
  233. <?php  
  234.   
  235.   
  236. header("Content-Type:text/html; charset:utf-8");  
  237.   
  238.   
  239. if(emptyempty($_POST)) {  
  240.   
  241.   
  242. ?>  
  243.   
  244.   
  245. <html>  
  246.   
  247.   
  248. <head>  
  249.   
  250.   
  251. <meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">  
  252.   
  253.   
  254. <title>人脸识别</title>  
  255.   
  256.   
  257. </head>  
  258.   
  259.   
  260. <body>  
  261.   
  262.   
  263. <h2>人脸识别</h2>  
  264.   
  265.   
  266. PS: 请上传一张带有人脸的图片<br />  
  267.   
  268.   
  269. <form name="form" id="form" method="POST" enctype="multipart/form-data" action="">  
  270.   
  271.   
  272. 上传图片:<input type="file" name="pic" size="20″">  
  273.   
  274.   
  275. <input type="submit" name="submit" value="上传">  
  276.   
  277.   
  278. </form>  
  279.   
  280.   
  281. </body>  
  282.   
  283.   
  284. </html>  
  285.   
  286.   
  287. <?php  
  288.   
  289.   
  290. else {  
  291.   
  292.   
  293. $img = $_FILES['pic']['tmp_name'];  
  294.   
  295.   
  296.   
  297.   
  298.   
  299. $arr = face_detect($img'haarcascade_frontalface_alt2.xml');  
  300.   
  301.   
  302.   
  303.   
  304.   
  305. if(is_array($arr1)) {  
  306.   
  307.   
  308. $all = array_merge($arr,$arr1);  
  309.   
  310.   
  311. else {  
  312.   
  313.   
  314. $all = $arr;  
  315.   
  316.   
  317. }  
  318.   
  319.   
  320. $allowtype = 1;  
  321.   
  322.   
  323. switch($_FILES['pic']['type']){  
  324.   
  325.   
  326. case 'image/pjpeg'$fix_pic.= ".jpg"break;  
  327.   
  328.   
  329. case 'image/jpeg'$fix_pic.= ".jpg"break;  
  330.   
  331.   
  332. case 'image/x-png'$fix_pic.= ".png"break;  
  333.   
  334.   
  335. case 'image/png'$fix_pic.= ".png"break;  
  336.   
  337.   
  338. default$allowtype = 0; break;  
  339.   
  340.   
  341. }  
  342.   
  343.   
  344.   
  345.   
  346.   
  347. if($allowtype == 0) {  
  348.   
  349.   
  350. echo "文件格式错误:只运行jpg或png图片";exit;  
  351.   
  352.   
  353. }  
  354.   
  355.   
  356.   
  357.   
  358.   
  359. $tmp_name = time();  
  360.   
  361.   
  362. $src_pic = "./".$tmp_name.$fix_pic;  
  363.   
  364.   
  365. move_uploaded_file($_FILES['pic']['tmp_name'], $src_pic);  
  366.   
  367.   
  368.   
  369.   
  370.   
  371. $pic_src = $pic_dst = array();  
  372.   
  373.   
  374. if(is_array($all)){  
  375.   
  376.   
  377. foreach ($all as $k => $v){  
  378.   
  379.   
  380. $tmp_name_new = $tmp_name."_".$k;  
  381.   
  382.   
  383. $x = $v['x'];  
  384.   
  385.   
  386. $y = $v['y'];  
  387.   
  388.   
  389. $w = $v['w'];  
  390.   
  391.   
  392. $h = $v['h'];  
  393.   
  394.   
  395. $dst_pic = "./".$tmp_name_new.$fix_pic;  
  396.   
  397.   
  398. // echo $src_pic."<br>";  
  399.   
  400.   
  401. // echo $dst_pic."<br>";  
  402.   
  403.   
  404. $cmd = "/usr/local/bin/convert -crop ".$w."x".$h."+".$x."+".$y." ".$src_pic." ".$dst_pic;  
  405.   
  406.   
  407. // echo $cmd."<br>";  
  408.   
  409.   
  410. echo `$cmd`;  
  411.   
  412.   
  413. $pic_src[] = "./".$tmp_name.$fix_pic;  
  414.   
  415.   
  416. $pic_dst[] = "./".$tmp_name_new.$fix_pic;  
  417.   
  418.   
  419. }  
  420.   
  421.   
  422. }  
  423.   
  424.   
  425.   
  426.   
  427.   
  428. foreach($pic_src as $key => $value) {  
  429.   
  430.   
  431. echo "<img src='".$value."'> => <img src='".$pic_dst[$key]."'><br>";  
  432.   
  433.   
  434. }  
  435.   
  436.   
  437. }  
  438.   
  439.   
  440. ?>  

 

 在测试。。。。