一,说明及环境

代码是完全参考opencv中自带的源代码,将其中很多不必要的代码已经删除。环境是opencv2413,vs2013,win10。

目录结构如图所示:

其中的xml文件在opencv/sources/data中,图片在opencv/sources/samples/c/,复制到自己的项目目录下。

二,代码及注释

#include "stdafx.h"
#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <cctype>
#include <iostream>
#include <iterator>
#include <stdio.h>using namespace std;
using namespace cv;//面部和眼睛检测并绘制矩形框,参数一次为图片数据,面部和眼部的级联分类器,检测时允许的图片缩小比例
void detectAndDraw(Mat& img, CascadeClassifier& faceCascade, CascadeClassifier& eyeCascade, double scale);
//脸部和眼部的训练数据,就是以xml文件的形式,存储了标准的用来比对的模特数据,文件放在了当前目录
string faceCascadeName = "haarcascade_frontalface_alt.xml";//面部
string eyeCascadeName = "haarcascade_eye.xml";//眼部int main(int argc, const char** argv)
{Mat image;//opencv中存储数据的基本单位,存储帧,图片等,代替旧版本的IplImagestring inputName("lena.jpg");//示例图片,放在当前目录CascadeClassifier faceCascade, eyeCascade;//定义级联分类器,由它们实现检测功能double scale = 1;//不缩小图片,这样可以提高准确率if (!faceCascade.load(faceCascadeName) || !eyeCascade.load(eyeCascadeName))//载入xml训练数据{return -1;}image = imread(inputName, CV_LOAD_IMAGE_COLOR);//读取图片,第二个参数说明是彩色图片cvNamedWindow("result", 1);//创建窗口,命名result,id为1if (!image.empty()){detectAndDraw(image, faceCascade, eyeCascade, scale);//进行识别}waitKey(0);//等待建入cvDestroyWindow("result");//销毁窗口return 0;
}void detectAndDraw(Mat& img, CascadeClassifier& faceCascade,CascadeClassifier& eyeCascade,double scale)
{int i = 0;double t = 0;vector<Rect> faces,eyes;//用来存储检测出来的面部和眼部数据,我们无法确定个数,因此定义成vectorMat gray, smallImg(cvRound(img.rows / scale), cvRound(img.cols / scale), CV_8UC1);//smallImg已缩放cvtColor(img, gray, CV_BGR2GRAY);//图片颜色格式转化,CV_BGR2GRAY是从BGR到gray,彩色到灰色resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR);//将灰色图像适应大小到smallImg中equalizeHist(smallImg, smallImg);//加强对比度,提高检测准确率t = (double)cvGetTickCount();//获取当前时间//使用级联分类器进行识别,参数为灰度图片,面部数组,检测单元的增长率,是否融合检测出的矩形,最小检测单元大小faceCascade.detectMultiScale(smallImg, faces, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));for (vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++){cv::rectangle(img, *r, Scalar(0,255,0), 1, 1, 0);//在img上绘制出检测到的面部矩形框,绿色框Mat faceROI = smallImg(*r);//设置图片感兴趣区域,也就是改变了图片原点和长宽,实际像素数据没有丢失eyeCascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));for (vector<Rect>::const_iterator e = eyes.begin(); e != eyes.end(); e++){Rect eyeR;eyeR.x = r->x + e->x;//从感兴趣区域映射到整个图片区域eyeR.y = r->y + e->y;eyeR.height = e->height;eyeR.width = e->width;cv::rectangle(img, eyeR, Scalar(0, 255, 255), 1, 1, 0);//绘制检测到的眼睛矩形框,黄色框}}t = (double)cvGetTickCount() - t;//获取当前时间printf("detection time = %g ms\n", t / ((double)cvGetTickFrequency()*1000.));//转化成毫秒打印cv::imshow("result", img);//将img显示到result窗口
}

三,程序运行结果

detectMultiScale()的第四个参数设为2时:

detectMultiScale()的第四个参数设为0,且只检测面部时:

由程序运行结果可以看出,opencv特征检测,是对图片进行大小不等的单元分别检测,并将所有可能的结果获取,有参数决定是否融合。另外左上角出现了一个错误的识别区,但是在detectMultiScale()的第四个参数设为2,进行融合时,opencv已经去掉。


openCV实现多人脸检测,多眼部检测,完整代码和详细注释相关推荐

  1. OpenCV差分二值化的实时场景文本检测的实例(附完整代码)

    OpenCV差分二值化的实时场景文本检测的实例 OpenCV差分二值化的实时场景文本检测的实例 OpenCV差分二值化的实时场景文本检测的实例 OpenCV差分二值化的实时场景文本检测的实例(附完整代 ...

  2. OpenCV基本线性变换轨迹栏的实例(附完整代码)

    OpenCV基本线性变换轨迹栏的实例 OpenCV基本线性变换轨迹栏的实例 OpenCV基本线性变换轨迹栏的实例 OpenCV基本线性变换轨迹栏的实例(附完整代码) #include "op ...

  3. OpenCV OMZ MTCNN人脸检测的实例(附完整代码)

    OpenCV OMZ MTCNN人脸检测的实例 OpenCV OMZ MTCNN人脸检测的实例 OpenCV OMZ MTCNN人脸检测的实例 #include <algorithm> # ...

  4. OpenCV cv::CascadeClassifier人脸检测的实例(附完整代码)

    OpenCV cv::CascadeClassifier人脸检测的实例 OpenCV cv::CascadeClassifier人脸检测的实例 OpenCV cv::CascadeClassifier ...

  5. 【MediaPipe】(3) AI视觉,人脸识别,附python完整代码

    各位同学好,今天和大家分享一下如何使用MediaPipe完成人脸实时跟踪检测,先放张图看效果,FPS值为14,右侧的输出为:每帧图像是人脸的概率,检测框的左上角坐标及框的宽高. 有需要的可以使用 cv ...

  6. python+OpenCv+dlib实现人脸68个关键点检测

    pip install dlib==19.7.0 下载地址: http://dlib.net/files/ dlib中为我们提供了关于人脸检测标注训练好的文件可在http://dlib.net/fil ...

  7. 【机器视觉案例】(11) 眨眼计数器,人脸关键点检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用 mediapipe+opencv 实现眨眼计数器.先放张图看效果. 下图左侧为视频图像,右侧为平滑后的人眼开合比曲线.以左眼为例,若眼眶上下边界的距离与左右边界 ...

  8. 【yolov4目标检测】(4) opencv+yolov4-tiny 实现选择性目标检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用 opencv 调用 yolov4-tiny 目标检测方法,并对指定类别进行检测.用b站的视频做测试. 点击按钮 'all',按钮变红色,对所有的类别检测 点击按 ...

  9. 【opencv】(13) 案例:停车场空余车位检测,附python完整代码

    各位同学好,今天和大家分享一下如何使用Opencv完成停车场的车位检测,及空余车位计数,先放张图看效果. 红框代表该车位有车,绿框代表该车位空余,左上角记录有几个空余车位,黄色数字代表该车位内的像素个 ...

  10. OpenCV SURF检测的实例(附完整代码)

    OpenCV SURF检测的实例 OpenCV SURF检测的实例 OpenCV SURF检测的实例 #include <iostream> #include "opencv2/ ...

最新文章

  1. 圣才电子书怎么提取pdf_总结10个免费网站,助你解决PDF所有问题!
  2. angular4 php,Angular4中常用管道实例详解
  3. nginx在linux reload报错,linux下安装nginx
  4. 数据结构:四种排序的比较
  5. MATLAB电路模拟——微分运算
  6. 帆软报表填报成功后实时刷新当前页面
  7. J-Trace入门系列1:感动人心的功能与更感动人心的售价
  8. CHKRecovery(文件删除还原工具)v3.3.0绿色版
  9. JAVA计算机毕业设计无人智慧药柜系统设计(附源码、数据库)
  10. Excel - SUM和ABS函数联合使用
  11. 项目中git的运用及命令明细
  12. 12306抢票软件相关接口以及数据格式
  13. 基于SSM的概念可视化程序设计学习系统 毕业设计-附源码021009
  14. opencv PIL读取图像得到的图像格式
  15. bilibili缓存文件在哪里_64G手机总提示空间不足?清理这4个文件夹,内存立马空出十几G...
  16. 几篇很好的文章(介绍VB.NET类),不断增加中
  17. 桌球歷史:削球、快攻、弧圈球
  18. linux分区方案 1t,linux CentOS WEB服务器分区方案
  19. 【来日复制粘贴】关于排名
  20. mobaxterm标签页最下方服务器内存硬盘情况信息的状态栏显示与关闭

热门文章

  1. 在PHP中怎么判断字符串中没有,在php中搜索字符串中没有的字符
  2. 为解决WINDOWS JRE启动外壳,找了好几个方案
  3. 全网首发:JAVA的+=类算符,带有自动类型转换功能
  4. JDK有三种字体绘制系统
  5. 百万生意难度跟十万一样,十万的也没做成
  6. 解决办法:Type safety: The expression of type List needs unchecked conversion to conform
  7. 解决办法:对BZ2_bzDecompressInit/BZ2_bzDecompress/BZ2_bzDecompressEnd未定义的引用
  8. 电脑不会当局者迷——评人机围棋大战
  9. 无继承情况下的对象构造
  10. android 绕过动态权限,android绕过permission验证及fork进程权限提升