Archive

Posts Tagged ‘facedetect’

安装 facedetect

May 17th, 2009 陈毓端 No comments

wget http://www.xarg.org/download/facedetect-1.0.0.tar.gz

  1. tar zvxf facedetect-1.0.0.tar.gz
  2. /usr/local/php5/phpize (php扩展到编译方式)
  3. ./configure --with-php-config=/usr/local/php5/bin/php-config
  4. make && make install
  5. vi /usr/local/php5/etc/php.ini
  6. extension=facedetect.so

重启apache

phpinfo 查看facedetect 模块是否加载。

测试例子

  1. <?php
  2. var_dump(face_count('./r/DSC01141.JPG', 'haarcascade_frontalface_alt.xml'));
  3.  
  4. $photoimgArray=face_detect('./r/DSC01141.JPG', 'haarcascade_frontalface_alt.xml');
  5. ?>

 

附加说明:

php facedetect 就封装的2个函数(方法)

face_detect 和face_count

源码:

  1. static function_entry facedetect_functions[] = {
  2.     PHP_FE(face_detect, NULL)
  3.     PHP_FE(face_count, NULL)
  4.     {NULL, NULL, NULL}
  5. };
  6.  
  7. 核心源码:
  8.  
  9. static void php_facedetect(INTERNAL_FUNCTION_PARAMETERS, int return_type)
  10. {
  11.  char *file, *casc;
  12.  long flen, clen;
  13.  
  14.  zval *array;
  15.  
  16.  CvHaarClassifierCascade* cascade;
  17.  IplImage *img, *gray;
  18.  CvMemStorage *storage;
  19.  CvSeq *faces;
  20.  CvRect *rect;
  21.  
  22.  if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &amp;file, &amp;flen, &amp;casc, &amp;clen) == FAILURE) {
  23.   RETURN_NULL();
  24.  }
  25.  
  26.  img = cvLoadImage(file, 1);
  27.  if(!img) {
  28.   RETURN_FALSE;
  29.  }
  30.  
  31.  cascade = (CvHaarClassifierCascade*)cvLoad(casc, 0, 0, 0);
  32.  if(!cascade) {
  33.   RETURN_FALSE;
  34.  }
  35.  
  36.  gray = cvCreateImage(cvSize(img-&gt;width, img-&gt;height), 8, 1);
  37.  cvCvtColor(img, gray, CV_BGR2GRAY);
  38.  cvEqualizeHist(gray, gray);
  39.  
  40.  storage = cvCreateMemStorage(0);
  41.  
  42.  faces = cvHaarDetectObjects(gray, cascade, storage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(0, 0));
  43.  
  44.  if(return_type) {
  45.  
  46.   array_init(return_value);
  47.  
  48.   if(faces &amp;&amp; faces-&gt;total &gt; 0) {
  49.    int i;
  50.    for(i = 0; i &lt; faces-&gt;total; i++) {
  51.     MAKE_STD_ZVAL(array);
  52.     array_init(array);
  53.  
  54.     rect = (CvRect *)cvGetSeqElem(faces, i);
  55.  
  56.     add_assoc_long(array, "x", rect-&gt;x);
  57.     add_assoc_long(array, "y", rect-&gt;y);
  58.     add_assoc_long(array, "w", rect-&gt;width);
  59.     add_assoc_long(array, "h", rect-&gt;height);
  60.  
  61.     add_next_index_zval(return_value, array);
  62.    }
  63.   }
  64.  } else {
  65.   RETVAL_LONG(faces ? faces-&gt;total : 0);
  66.  }
  67.  
  68.  cvReleaseMemStorage(&amp;storage);
  69.  cvReleaseImage(&amp;gray);
  70.  cvReleaseImage(&amp;img);
  71. }
Categories: linux, php Tags: