首先上两张图。

现在要对上面两张图进行人脸识别。

一、Haar特征分类器介绍

Haar特征分类器就是一个XML文件,该文件中会描述人体各个部位的Haar特征值。包括人脸、眼睛、嘴唇等等。

Haar特征分类器存放目录:opencv安装目录中的\data\ haarcascades目录下,opencv2.4.8版本下的Haar特征分类器如下:

haarcascade_eye.xml

haarcascade_eye_tree_eyeglasses.xml

haarcascade_frontalface_alt.xml

haarcascade_frontalface_alt_tree.xml

haarcascade_frontalface_alt2.xml

haarcascade_frontalface_default.xml

haarcascade_fullbody.xml

haarcascade_lefteye_2splits.xml

haarcascade_lowerbody.xml

haarcascade_mcs_eyepair_big.xml

haarcascade_mcs_eyepair_small.xml

haarcascade_mcs_leftear.xml

haarcascade_mcs_lefteye.xml

haarcascade_mcs_mouth.xml

haarcascade_mcs_nose.xml

haarcascade_mcs_rightear.xml

haarcascade_mcs_righteye.xml

haarcascade_mcs_upperbody.xml

haarcascade_profileface.xml

haarcascade_righteye_2splits.xml

haarcascade_smile.xml

haarcascade_upperbody.xml

根据命名就可以很快知道各个分类器的用途。

其中:haarcascade_frontalface_alt.xml与haarcascade_frontalface_alt2.xml都是人脸识别的Haar特征分类器了。

二、detectMultiScale函数详解

cvHaarDetectObjects是opencv1中的函数,opencv2中人脸检测使用的是 detectMultiScale函数。它可以检测出图片中所有的人脸,并将人脸用vector保存各个人脸的坐标、大小(用矩形表示),函数由分类器对象调用:

void detectMultiScale(

const Mat& image,

CV_OUT vector& objects,

double scaleFactor = 1.1,

int minNeighbors = 3,

int flags = 0,

Size minSize = Size(),

Size maxSize = Size()

);

函数介绍:

参数1:image--待检测图片,一般为灰度图像加快检测速度;

参数2:objects--被检测物体的矩形框向量组;

参数3:scaleFactor--表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;

参数4:minNeighbors--表示构成检测目标的相邻矩形的最小个数(默认为3个)。

如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。

如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框,

这种设定值一般用在用户自定义对检测结果的组合程序上;

参数5:flags--要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为

CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,

因此这些区域通常不会是人脸所在区域;

参数6、7:minSize和maxSize用来限制得到的目标区域的范围。

三、示例代码

#include

#include

#include

#include

#include

using namespace std;

using namespace cv;

int main()

{

// 【1】加载分类器

CascadeClassifier cascade;

cascade.load("haarcascade_frontalface_alt2.xml");

Mat srcImage, grayImage,dstImage;

// 【2】读取图片

srcImage = imread("image.jpg");

dstImage = srcImage.clone();

imshow("【原图】", srcImage);

grayImage.create(srcImage.size(), srcImage.type());

cvtColor(srcImage, grayImage, CV_BGR2GRAY); // 生成灰度图,提高检测效率

// 定义7种颜色,用于标记人脸

Scalar colors[] =

{

// 红橙黄绿青蓝紫

CV_RGB(255, 0, 0),

CV_RGB(255, 97, 0),

CV_RGB(255, 255, 0),

CV_RGB(0, 255, 0),

CV_RGB(0, 255, 255),

CV_RGB(0, 0, 255),

CV_RGB(160, 32, 240)

};

// 【3】检测

vector rect;

cascade.detectMultiScale(grayImage, rect, 1.1, 3, 0);  // 分类器对象调用

printf("检测到人脸个数:%d\n", rect.size());

// 【4】标记--在脸部画圆

for (int i = 0; i

{

Point  center;

int radius;

center.x = cvRound((rect[i].x + rect[i].width * 0.5));

center.y = cvRound((rect[i].y + rect[i].height * 0.5));

radius = cvRound((rect[i].width + rect[i].height) * 0.25);

circle(dstImage, center, radius, colors[i % 7], 2);

}

// 【5】显示

imshow("【人脸识别detectMultiScale】", dstImage);

waitKey(0);

return 0;

}

效果图:

如果要识别人体的其它部位,只需将上面的haarcascade_frontalface_alt2.xml分类器替换即可。

detectmultiscale函数参数含义_OpenCV人脸识别--detectMultiScale函数相关推荐

  1. detectmultiscale函数参数含义_OpenCV detectMultiScale函数

    对输入图片进行行人检测时由于图片的大小不一样,所以要用到多尺度检测.这里是用hog类的方法detectMultiScale. 函数原型: HOGDescriptor::detectMultiScale ...

  2. c语言中realloc函数参数含义,怎么正确用realloc函数

    如何正确用realloc函数 #include #include int main() { char *q; char *p; q=(char*)malloc(sizeof(char)); print ...

  3. sklearn的train_test_split()各函数参数含义解释(非常全)

    sklearn的train_test_split()各函数参数含义解释(非常全) sklearn的train_test_split()各函数参数含义解释(非常全) - The-Chosen-One - ...

  4. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  5. 用指针做函数参数自己编程实现字符串连接函数strcat()的功能。CQUPT题库

    用指针做函数参数自己编程实现字符串连接函数strcat()的功能.CQUPT题库 下面程序中存在比较隐蔽的错误,请通过分析和调试程序,发现并改正程序中的错误. 注意:请将修改正确后的完整源程序拷贝粘贴 ...

  6. c 语言 模板函数参数,深入解析C++中的函数模板和函数的默认参数

    C++函数模板 我们知道,数据或数值可以通过函数参数传递,在函数定义时它们是未知的,只有在发生函数调用时才能确定其值.这就是数据的参数化. 其实,数据类型也可以通过参数来传递,在函数定义是可以不指明具 ...

  7. c语言以数组作为函数参数,C语言将数组作为函数参数

    一个函数的形参是普通的局部变量.当发生函数调用时,程序创建这些形参,然后用对应的实参来初始化这些形参.形参的作用域就是函数块.函数内可以改变形参的值,而不会影响调用上下文中实参的值. 如果需要将一个数 ...

  8. keras中的fit函数参数_keras的fit_generator与callback函数

    fit_generator函数 fit_generator函数 callback类 每一个epoch结束(on_epoch_end)时,都要调用callback函数,callback函数(类)都要集成 ...

  9. python中round函数参数有负数_Python中round函数使用注意事项

    使用round函数的时候发现了一个奇怪的现象.一直觉得round函数是一个用于四舍五入的函数,结果却不一定.一般如果觉得奇怪,那就是没弄懂其本质的运作原理,所以深入了解了下round函数. Pytho ...

最新文章

  1. java中对象输入流和输出流
  2. cwinthread*线程指针怎么销毁结束_C++知识点:智能指针
  3. Node.js摸石头系列目录
  4. ubuntu服务器系统不识别,U盘安装16.04server版 安装好后重启 无法进入系统
  5. 如何使用CineMatch的伪色指南功能来帮助评估图像
  6. HTML5 WebGame开源工具之impactjs
  7. fanuc系统屏蔽服务器,FANUC伺服轴的屏蔽方法
  8. HFSS - 同轴馈电矩形微带天线设计与仿真
  9. 商汤科技面试——实习面试案例总结
  10. Get rid of annoying security alerts in Microsoft Outlook!
  11. Linux配置Samba实现局域网共享文件夹
  12. 2023上海面料展览会
  13. 从总监到CEO的一些思考和理解
  14. CVE的提交与Github写入技巧
  15. python爬取高德地图_爬虫实战:如何爬取高德地图?
  16. 深度学习量化总结(PTQ、QAT)
  17. 【js特效】www.zhen.com图片频道页特效
  18. react加水印_React水印组件,支持图片水印,文字水印
  19. Generalizing to Unseen Domains: A Survey on Domain Generalization 论文分享
  20. 模型评估标准常用指标

热门文章

  1. 线段树 HDU 3397
  2. Java读取、创建Excel;验签,加密
  3. forward/redirect跳转页面的区别
  4. oracle 索引监控
  5. Glib2基本api调用流程(十五)
  6. Ubuntu18.04报错:system/tools/aidl/aidl_language_y.yy: error: define variable ‘api.pure‘ is not used
  7. 编译C++11/14方法
  8. wpf之lable右下角放关闭图标
  9. mac git命令行操作 git push pull 逻辑
  10. windows系统bat批处理 电脑换IP清空dns地址 清空缓存重新获取ip