opencv中的人脸检测
来源:互联网 发布:化纤衣服危害 知乎 编辑:程序博客网 时间:2024/06/06 23:55
#include "opencv2/objdetect.hpp"#include "opencv2/imgcodecs.hpp"#include "opencv2/videoio.hpp"#include "opencv2/highgui.hpp"#include "opencv2/imgproc.hpp"#include "opencv2/core/utility.hpp"#include "opencv2/videoio/videoio_c.h"#include "opencv2/highgui/highgui_c.h"#include <cctype>#include <iostream>#include <iterator>#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 kinds of rigid objects, once the appropriate classifier is trained.\n" "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" " [--try-flip]\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\n" "During execution:\n\tHit any key to quit.\n" "\tUsing OpenCV version " << CV_VERSION << "\n" << endl;}void detectAndDraw(Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip);//要使用到的两个cascade文件,用于联合检测人脸,opencv自带了多个xml文件,在opencv安装目录下的/source/data/haarcascades/ 文件夹内string cascadeName = "D:\\Program Files (x86)\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml";string nestedCascadeName = "D:\\Program Files (x86)\\opencv\\sources\\data\\haarcascades\\haarcascade_eye_tree_eyeglasses.xml";//检测眼睛int main(){ CvCapture* capture = 0; Mat frame, frameCopy, image; CascadeClassifier cascade, nestedCascade; char *srcImageFile = "C:\\Users\\n\\\Documents\\visualstudio2012\\Projects\\opencvDemo\\opencvDemo\\3.jpg";//测试图片 double scale = 1; if (!cascade.load(cascadeName))//载入cascade文件 { cerr << "ERROR: Could not load classifier cascade" << endl; help(); return -1; } image = imread("3.jpg"); cvNamedWindow("result", 1); cout << "In image read" << endl; if (!image.empty()) { detectAndDraw(image, cascade, nestedCascade, scale, 0);//检测人脸 waitKey(0); } cvDestroyWindow("result"); return 0;}void detectAndDraw(Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip){ int i = 0; double t = 0; vector<Rect> faces, faces2; 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, COLOR_BGR2GRAY); resize(gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR); equalizeHist(smallImg, smallImg); t = (double)cvGetTickCount(); cascade.detectMultiScale(smallImg, faces, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH | CASCADE_SCALE_IMAGE , Size(30, 30)); if (tryflip) { flip(smallImg, smallImg, 1); cascade.detectMultiScale(smallImg, faces2, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH | CASCADE_SCALE_IMAGE , Size(30, 30)); for (vector<Rect>::const_iterator r = faces2.begin(); r != faces2.end(); r++) { faces.push_back(Rect(smallImg.cols - r->x - r->width, r->y, r->width, r->height)); } } 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; double aspect_ratio = (double)r->width / r->height; if (0.75 < aspect_ratio && aspect_ratio < 1.3) { 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); } else rectangle(img, cvPoint(cvRound(r->x*scale), cvRound(r->y*scale)), cvPoint(cvRound((r->x + r->width - 1)*scale), cvRound((r->y + r->height - 1)*scale)), color, 3, 8, 0); if (nestedCascade.empty()) continue; smallImgROI = smallImg(*r); nestedCascade.detectMultiScale(smallImgROI, nestedObjects, 1.1, 2, 0 //|CASCADE_FIND_BIGGEST_OBJECT //|CASCADE_DO_ROUGH_SEARCH //|CASCADE_DO_CANNY_PRUNING | CASCADE_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);}
阅读全文
0 0
- opencv中的人脸检测
- opencv中的人脸检测
- opencv 图片中的 人脸检测
- opencv中的人脸检测讲解
- opencv中的侧脸检测
- opencv 检测人脸
- opencv检测人脸
- 人脸检测 opencv
- OpenCV人脸检测
- opencv人脸检测
- OpenCV人脸检测
- OpenCv人脸检测
- opencv 人脸检测
- OpenCV人脸检测
- opencv人脸检测
- OpenCV人脸检测
- 人脸检测(opencv)
- opencv人脸检测
- leetcode 735[medium]---Asteroid Collision
- SVG初体验
- ubuntu eclipse opencv的环境配置(2)
- 邮件发送里面的SMTP Host
- Data Structure
- opencv中的人脸检测
- C++中使用placement new
- http://blog.csdn.NET/liweizhong193516/article/details/53639350
- Win10 Jupyter Notebook修改home路径
- 【智能零售】AI在双11中的个性化搜索和决策实践
- 截图软件03
- 设计思想学习—抽象工厂模式
- 机房收费系统---用例图
- BZOJ 3625 小朋友和二叉树(生成函数+FFT)