此函数用已经训练好的分类器(xml文件)来检测人脸人眼等。
【参数说明】
1.image——待检测图片,一般为灰度图像加快检测速度;
2.objects——被检测物体的矩形框向量组;
3.scaleFactor——每次图像尺寸减小的比例,默认为1.1,即每次缩小10%
4.minNeighbors——默认3,每一个目标至少要被检测到3次才算是真的目标(因为周围的像素和不同的窗口大小都可以检测到人脸)
5.flags——要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因为这些区域通常不会是人脸所在区域;
6.minSize——目标的最小尺寸
7.maxSize——目标的最大尺寸
【用法】
opencv源码目录D:\source\opencv-3.4.9\data\haarcascades里有很多训练好的xml,检测人脸的用以下之一。
把xml文件放到自己的工程目录中,运行下述代码即可。(图片网上找一个就可以)
#include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { // 【1】加载分类器 CascadeClassifier cascade; cascade.load("haarcascade_frontalface_default.xml"); // 【2】读取图片 Mat srcImage, grayImage; srcImage = imread("D:/face.jpg"); imshow("【原图】", srcImage); cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度图,提高检测效率 // 定义3种颜色,用于标记人脸 Scalar colors[] = { //蓝绿红 Scalar(255, 0, 0), Scalar(0, 255, 0), Scalar(0, 0, 255), }; // 【3】检测 vector<Rect> rects; cascade.detectMultiScale(grayImage, rects, 1.1, 3, 0); // 分类器对象调用 printf("检测到人脸个数:%d\n", rects.size()); // 【4】标记--在脸部画圆 for (int i = 0; i < rects.size(); i++) { Point center; int radius; //画圆 center.x = cvRound((rects[i].x + rects[i].width * 0.5)); center.y = cvRound((rects[i].y + rects[i].height * 0.5)); radius = cvRound((rects[i].width + rects[i].height) * 0.25); circle(srcImage, center, radius, colors[i % 3], 2); //画矩形 rectangle(srcImage, Rect(rects[i].x, rects[i].y, rects[i].width, rects[i].height), colors[i % 3], 2); } // 【5】显示 imshow("【人脸识别detectMultiScale】", srcImage); waitKey(0); return 0; }
【批量读取图片】
cv::String path = "D:/data/*.jpg"; vector<cv::String> paths; glob(path, paths);//遍历结果存储到paths中,paths内容格式如,D:/data/3.jpg Mat srcImg, grayImg; for (int i = 0; i < paths.size(); i++) { srcImg = imread(paths[i]); cvtColor(srcImg, grayImg, CV_BGR2GRAY); // 生成灰度图,提高检测效率 …………其他代码………… }