利用级联的haar分类器寻找检测目标
#include "cv.h"
#include "highgui.h"
CvHaarClassifierCascade* load_object_detector(const char* cascade_path) {
return (CvHaarClassifierCascade*)cvLoad(cascade_path);
}
void detect_and_draw_objects(IplImage* image,CvHaarClassifierCascade* cascade,int do_pyramids) {
IplImage* small_image = image;
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* faces;
int i, scale = 1;
// 如果操作方式flags被指定,向下测量输入图像以得到性能的提高
if (do_pyramids) {
small_image = cvCreateImage(cvSize(image->width / 2, image->height / 2),
IPL_DEPTH_8U, 3);
cvPyrDown(image, small_image, CV_GAUSSIAN_5x5);
scale = 2;
}
// 使用最快的变量
faces = cvHaarDetectObjects(small_image, cascade, storage, 1.2, 2,
CV_HAAR_DO_CANNY_PRUNING);
// 绘制所有矩形
for (i = 0; i < faces->total; i++) {
CvRect face_rect = *(CvRect*)cvGetSeqElem(faces, i);
cvRectangle(image, cvPoint(face_rect.x*scale, face_rect.y*scale),
cvPoint((face_rect.x + face_rect.width)*scale,
(face_rect.y + face_rect.height)*scale),
CV_RGB(255, 0, 0), 3);
}
if (small_image != image)
cvReleaseImage(&small_image);
cvReleaseMemStorage(&storage);
}
int main(int argc, char** argv) {
//摄像头
CvCapture *cap = cvCreateCameraCapture(0);//初始化相机捕获的指针
if (!cap)
{
system("pause");
exit(-1);
}
IplImage *image = cvQueryFrame(cap);
CvHaarClassifierCascade* cascade;
//新建窗口
cvNamedWindow("视频监控", CV_WINDOW_AUTOSIZE);
while ((image = cvQueryFrame(cap)) != NULL)
{
//IplImage* image = cvLoadImage("Lena.tif", 1);
//加载分类器
cascade = load_object_detector("haarcascade_frontalface_alt.xml");//人脸
//cascade = load_object_detector("haarcascade_eye_tree_eyeglasses.xml");//左眼
detect_and_draw_objects(image, cascade, 1);
//显示视频
cvShowImage("视频监控", image);
char c = cvWaitKey(10);
if (c == 27) break;
}
cvWaitKey(0);
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseCapture(&cap);
cvReleaseImage(&image);
cvDestroyWindow("test");
return 0;
}