opencv detectMultiScale()
此函数用已经训练好的分类器(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;
}
相关推荐
wangdaren 2020-04-26
learningCV 2020-11-10
learningCV 2020-08-25
huang00 2020-08-21
wangdaren 2020-08-15
BeanJoy 2020-07-28
csdmeb 2020-06-25
wangdaren 2020-06-14
pythonxuexi 2020-06-13
woniulx0 2020-06-13
greent00 2020-06-10
liangzuojiayi 2020-06-09
greent00 2020-06-09
csdmeb 2020-06-08
BeanJoy 2020-06-06
lihuifei 2020-06-05
wangdaren 2020-06-03
wangdaren 2020-05-31