概念
OpenCV 级联分类器是一种基于 Haar 特征、AdaBoost 算法和级联结构的目标检测方法,通过多阶段筛选快速排除非目标区域,实现高效实时检测(如人脸、行人等)。
加载级联分类器
// 加载级联分类器
CascadeClassifier cascade;
// 加载级联分类器文件
cascade.load("xml/cars.xml");
关键代码
void detec_car(Mat &frame,CascadeClassifier cascade,double scale)
{
// 灰度处理
Mat gray_frame;
cvtColor(frame,gray_frame,CV_BGR2GRAY);
// 压缩灰度图到原来一半
Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
resize(gray_frame,smalling,smalling.size(),0,0,INTER_LINEAR);
// 直方图均值化:利用直方图均衡函数让图像呈现出黑白分明,凸显出主要检测的目标
equalizeHist(smalling,smalling);
// 使用级联分类器模型识别车辆
vector<Rect> cars;
cascade.detectMultiScale(smalling,cars,1.1,2,0|CV_HAAR_SCALE_IMAGE,Size(30,30));
// 绘制矩形框
vector<Rect>::const_iterator itr;
for(itr=cars.begin();itr!=cars.end();itr++){
rectangle(
frame,
cvPoint(cvRound(itr->x*scale),cvRound(itr->y*scale)),
cvPoint(cvRound((itr->x+itr->width)*scale),cvRound((itr->y+itr->height)*scale)),
Scalar(0,255,0),2,3);
}
imshow("res",frame);
}