总结:

If you have a detected face (frontal face) a rough positions of the left and right eye regions are then estimated using anthropometric relations as show below.

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"#include <iostream>
#include <stdio.h>using namespace std;
using namespace cv;static void help()
{cout << "\nThis program demonstrates the cascade recognizer. Now you can use Haar or LBP features.\n""This classifier can recognize many ~rigid objects, it's most known use is for faces.\n""Usage:\n""./facedetect [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]\n""   [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n""   [--scale=<image scale greater or equal to 1, try 1.3 for example>\n""   [filename|camera_index]\n\n""see facedetect.cmd for one call:\n""./facedetect --cascade=\"../../data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"../../data/haarcascades/haarcascade_eye.xml\" --scale=1.3 \n""Hit any key to quit.\n""Using OpenCV version " << CV_VERSION << "\n" << endl;
}void detectAndDraw( Mat& img,CascadeClassifier& cascade, CascadeClassifier& nestedCascade,double scale);String cascadeName = "../../data/haarcascades/haarcascade_frontalface_alt.xml";
String nestedCascadeName = "../../data/haarcascades/haarcascade_eye_tree_eyeglasses.xml";int main( int argc, const char** argv )
{CvCapture* capture = 0;Mat frame, frameCopy, image;const String scaleOpt = "--scale=";size_t scaleOptLen = scaleOpt.length();const String cascadeOpt = "--cascade=";size_t cascadeOptLen = cascadeOpt.length();const String nestedCascadeOpt = "--nested-cascade";size_t nestedCascadeOptLen = nestedCascadeOpt.length();String inputName;help();CascadeClassifier cascade, nestedCascade;double scale = 1;for( int i = 1; i < argc; i++ ){cout << "Processing " << i << " " <<  argv[i] << endl;if( cascadeOpt.compare( 0, cascadeOptLen, argv[i], cascadeOptLen ) == 0 ){cascadeName.assign( argv[i] + cascadeOptLen );cout << "  from which we have cascadeName= " << cascadeName << endl;}else if( nestedCascadeOpt.compare( 0, nestedCascadeOptLen, argv[i], nestedCascadeOptLen ) == 0 ){if( argv[i][nestedCascadeOpt.length()] == '=' )nestedCascadeName.assign( argv[i] + nestedCascadeOpt.length() + 1 );if( !nestedCascade.load( nestedCascadeName ) )cerr << "WARNING: Could not load classifier cascade for nested objects" << endl;}else if( scaleOpt.compare( 0, scaleOptLen, argv[i], scaleOptLen ) == 0 ){if( !sscanf( argv[i] + scaleOpt.length(), "%lf", &scale ) || scale < 1 )scale = 1;cout << " from which we read scale = " << scale << endl;}else if( argv[i][0] == '-' ){cerr << "WARNING: Unknown option %s" << argv[i] << endl;}elseinputName.assign( argv[i] );}if( !cascade.load( cascadeName ) ){cerr << "ERROR: Could not load classifier cascade" << endl;cerr << "Usage: facedetect [--cascade=<cascade_path>]\n""   [--nested-cascade[=nested_cascade_path]]\n""   [--scale[=<image scale>\n""   [filename|camera_index]\n" << endl ;return -1;}if( inputName.empty() || (isdigit(inputName.c_str()[0]) && inputName.c_str()[1] == '\0') ){capture = cvCaptureFromCAM( inputName.empty() ? 0 : inputName.c_str()[0] - '0' );int c = inputName.empty() ? 0 : inputName.c_str()[0] - '0' ;if(!capture) cout << "Capture from CAM " <<  c << " didn't work" << endl;}else if( inputName.size() ){image = imread( inputName, 1 );if( image.empty() ){capture = cvCaptureFromAVI( inputName.c_str() );if(!capture) cout << "Capture from AVI didn't work" << endl;}}else{image = imread( "lena.jpg", 1 );if(image.empty()) cout << "Couldn't read lena.jpg" << endl;}cvNamedWindow( "result", 1 );if( capture ){cout << "In capture ..." << endl;for(;;){IplImage* iplImg = cvQueryFrame( capture );frame = iplImg;if( frame.empty() )break;if( iplImg->origin == IPL_ORIGIN_TL )frame.copyTo( frameCopy );elseflip( frame, frameCopy, 0 );detectAndDraw( frameCopy, cascade, nestedCascade, scale );if( waitKey( 10 ) >= 0 )goto _cleanup_;}waitKey(0);_cleanup_:cvReleaseCapture( &capture );}else{cout << "In image read" << endl;if( !image.empty() ){detectAndDraw( image, cascade, nestedCascade, scale );waitKey(0);}else if( !inputName.empty() ){/* assume it is a text file containing thelist of the image filenames to be processed - one per line */FILE* f = fopen( inputName.c_str(), "rt" );if( f ){char buf[1000+1];while( fgets( buf, 1000, f ) ){int len = (int)strlen(buf), c;while( len > 0 && isspace(buf[len-1]) )len--;buf[len] = '\0';cout << "file " << buf << endl;image = imread( buf, 1 );if( !image.empty() ){detectAndDraw( image, cascade, nestedCascade, scale );c = waitKey(0);if( c == 27 || c == 'q' || c == 'Q' )break;}else{cerr << "Aw snap, couldn't read image " << buf << endl;}}fclose(f);}}}cvDestroyWindow("result");return 0;
}void detectAndDraw( Mat& img,CascadeClassifier& cascade, CascadeClassifier& nestedCascade,double scale)
{int i = 0;double t = 0;vector<Rect> faces;const static Scalar colors[] =  { CV_RGB(0,0,255),CV_RGB(0,128,255),CV_RGB(0,255,255),CV_RGB(0,255,0),CV_RGB(255,128,0),CV_RGB(255,255,0),CV_RGB(255,0,0),CV_RGB(255,0,255)} ;Mat gray, smallImg( cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 );cvtColor( img, gray, CV_BGR2GRAY );resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );equalizeHist( smallImg, smallImg );t = (double)cvGetTickCount();cascade.detectMultiScale( smallImg, faces,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH|CV_HAAR_SCALE_IMAGE,Size(30, 30) );t = (double)cvGetTickCount() - t;printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ){Mat smallImgROI;vector<Rect> nestedObjects;Point center;Scalar color = colors[i%8];int radius;center.x = cvRound((r->x + r->width*0.5)*scale);center.y = cvRound((r->y + r->height*0.5)*scale);radius = cvRound((r->width + r->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );if( nestedCascade.empty() )continue;smallImgROI = smallImg(*r);nestedCascade.detectMultiScale( smallImgROI, nestedObjects,1.1, 2, 0//|CV_HAAR_FIND_BIGGEST_OBJECT//|CV_HAAR_DO_ROUGH_SEARCH//|CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_SCALE_IMAGE,Size(30, 30) );for( vector<Rect>::const_iterator nr = nestedObjects.begin(); nr != nestedObjects.end(); nr++ ){center.x = cvRound((r->x + nr->x + nr->width*0.5)*scale);center.y = cvRound((r->y + nr->y + nr->height*0.5)*scale);radius = cvRound((nr->width + nr->height)*0.25*scale);circle( img, center, radius, color, 3, 8, 0 );}}cv::imshow( "result", img );
}

人脸检测or五官检测相关推荐

  1. [计算机视觉]人脸应用:人脸检测、人脸对比、五官检测、眨眼检测、活体检测、疲劳检测

    人脸应用在计算机视觉体系中占很大一块,在深度学习火起来之前,基于传统机器学习的人脸应用就已经很成熟了,有很多商用应用场景.本文用一个可以实际运行的Demo来说明人脸应用中常见的技术概念,包含'人脸检测 ...

  2. 人体的五官检测和皱纹检测系统-matlab

    程序实现:人体的五官检测和皱纹检测系统 首先定位人脸,鼻子,眼睛,嘴巴等部位,然后在根据定位的信息得到有关的部位,进而可以采取皱纹检测的方法,得到皱纹的有关信息,根据皱纹的多少得到相关的年龄推荐信息. ...

  3. HyperLandmark-开源人脸106点关键点检测SDK,北京智云视图科技

    原 HyperLandmark-开源人脸106点关键点检测SDK 2018年07月19日 15:25:44 lsy17096535 阅读数:3260 </div><div class ...

  4. 团队项目(2.2) -- 人脸检测和瞳孔检测

        在本项目中,人脸检测参考的主要理论依据为 Kaipeng Zhang,Zhanpeng Zhang,Zhifeng Li,Yu Qiao. Joint Face Detection and A ...

  5. flutter 刷脸_GitHub - nnnggel/baidu_face_plugin: 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android)...

    baidu_face_plugin 百度人脸识别和活体检测 Flutter 插件(目前版本仅支持 Android) 使用方式 注册百度开发者账号 前往 百度开发者账号 进行注册. 申请并配置licen ...

  6. CVPR 2020 | 腾讯优图17篇论文入选,含类比学习、人脸识别、物体检测、行人重识别等领域...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 本文来源:腾讯优图 全球计算机视觉顶级会议CVPR2020  (IEEE Conf ...

  7. 计算机视觉常用数据集总结:包括MS COCO、ImageNet、VOC、人脸识别、行人检测等...

    1.PASCAL VOC(权威鼻祖) PASCAL VOC是一个图像集,由Mark Everingham (University ofLeeds).Luc van Gool (ETHZ, Zurich ...

  8. 使用深度学习opencv 进行人脸年龄的实时检测

    2020-05-09 21:36:08 往期的文章我们分享了人脸的识别以及如何进行人脸年龄的检测,本期文章我们结合人脸识别的 模型进行人脸年龄的实时检测 人脸年龄的检测步骤 0.打开摄像头,获取图片数 ...

  9. 【深度学习】人脸识别和口罩检测的应用

    [深度学习]人脸识别和口罩检测的应用 文章目录 1 概述 2 人脸识别模型搭建与训练 3 口罩检测3.1 数据来源3.2 YoloV4简介3.3 数据集处理3.4 开始训练3.5 测试 1 概述 1. ...

最新文章

  1. 一键控制全屋设备,AI交互时代来临
  2. 第四十四章 Django ORM
  3. information_schema.character_sets 学习
  4. vim 常用快捷键(整理版)
  5. dz mysql导出shell_mysql数据备份并导入数据库shell脚本
  6. 智能监狱管理系统APP软件开发
  7. mysql字段包含空格查询
  8. C++ 定时每天十二点做某事
  9. 【相濡以沫、相忘于江湖】
  10. OpenGL的函数(GL)
  11. bmp图像文件格式说明
  12. Kaggle(入门)
  13. SSM框架搭建详细解析
  14. 网页中的三种地址详解
  15. 拼多多2018届毕业生校招笔试题
  16. CASS10.1.6更新说明,支持AutoCAD2019、2020平台了
  17. 好员工,别以为裁员与你无关(上
  18. python-如何解决执行pip install 命令的时候出现 File stdin,line 1 pip install XXX的问题
  19. 基于Anaconda安装环境的OpenCV机器视觉环境搭建
  20. Goland插件大全

热门文章

  1. 不用U盘,电脑之间快速传输大文件,共享功能
  2. 无机物及有机物储氢材料/MNi4.8Sn0.2(M=La,Nd)合金粒子负载纳米碳管复合储氢材料/LaNi4.8Sn0.2/CNTs纳米碳管复合储氢材料
  3. 转黄老师的“告别信狮”书
  4. Python自定义一个异常类【注释详细】
  5. WebServerApplication
  6. 五·C语言之·操作符这么有趣的嘛?
  7. 使用virt-install创建虚拟机
  8. 【日常】pytorch编写“自创”的MRR损失函数
  9. 最大可传输单元 MTU 对 UDP/TCP 包的大小限制
  10. POJ1837 DP