如何使用cv haarclassifier cascade

时间:2012-04-03 06:22:27

标签: opencv

cascade-> flag和cascade-> count表示什么 我想用这个训练过的haar分类器来检测面部,如何在不使用opencv现成功能的情况下使用。

1 个答案:

答案 0 :(得分:0)

这是我的函数,使用来自opencv的cascade应用cvHaarDetectObjects。我使用cv::resize对小图片(更快)和cv::equalizeHist执行检测。 Flags是签名,count是级联中的阶段数。 你应该阅读opencv documentation

cv::Rect Detect(const cv::Mat & img){
  assert(img.type()==CV_8U);
  // rectangle result
  cv::Rect rdet;
  // small img size
  int w = img.cols/img_scale_;
  int h = img.rows/img_scale_;
  if((small_img_.rows!=h) || (small_img_.cols!=w))small_img_.create(h,w,CV_8U);
  // grayscale img
  cv::Mat gray;
  if(img.channels() == 1)gray = img;
  else{
    gray=cv::Mat(img.rows,img.cols,CV_8U);
    cv::cvtColor(img,gray,CV_BGR2GRAY);
  }
  cv::resize(gray,small_img_,cv::Size(w,h),0,0,CV_INTER_LINEAR);
  cv::equalizeHist(small_img_,small_img_);
  // perform detection
  cvClearMemStorage(storage_);
  IplImage ipl_simg = small_img_;
  CvSeq* obj = cvHaarDetectObjects(&ipl_simg,cascade_,storage_,
                                scale_factor_,min_neighbors_,0,min_size_);
  if(obj->total == 0){
    return cv::Rect(0,0,0,0);
  }
  int maxv = 0;
  for(int i = 0; i < obj->total; i++){
    CvRect* r = (CvRect*)cvGetSeqElem(obj,i);
      if(i == 0 || maxv < r->width*r->height){
        maxv = r->width*r->height;
        rdet.x = r->x*img_scale_;
        rdet.y = r->y*img_scale_;
        rdet.width  = r->width*img_scale_;
        rdet.height = r->height*img_scale_;
      }  
    }
  cvRelease((void**)(&obj));
  return rdet;
}