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