• PUDN用户
    了解作者
  • C/C++
    开发工具
  • 2KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 5
    下载次数
  • 2018-05-27 15:07
    上传日期
人脸五官图像的识别,可以将人脸图像中的人脸和五官跟踪检测并标记出来,采用的是OpenCV结合VS2015平台实现的算法。
人脸五官检测.rar
  • 人脸五官检测.txt
    7.4KB
内容介绍
#include "opencv2/objdetect.hpp" #include "opencv2/highgui.hpp" #include "opencv2/imgproc.hpp" #include <iostream> #include <cstdio> #include <vector> #include <algorithm rel='nofollow' onclick='return false;'> using namespace std; using namespace cv; static void help() { cout << "\nThis program demonstrates the use of cv::CascadeClassifier class to detect objects (Face + eyes). 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_tree_eyeglasses.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); static void detectEyes(Mat&, vector<Rect_<int> >&, string); static void detectNose(Mat&, vector<Rect_<int> >&, string); static void detectMouth(Mat&, vector<Rect_<int> >&, string); string cascadeName; string nestedCascadeName; int main(int argc, const char** argv) { VideoCapture capture; Mat frame, image; string inputName; bool tryflip; CascadeClassifier cascade, nestedCascade; double scale; cv::CommandLineParser parser(argc, argv, "{help h||}" "{cascade|E:/VS2015WorkSpace/testOpencv/testOpencv/haarcascade_frontalface_alt.xml|}" "{nested-cascade|E:/VS2015WorkSpace/testOpencv/testOpencv/haarcascade_eye_tree_eyeglasses.xml|}" "{scale|1|}{try-flip||}{@filename|E:/VS2015WorkSpace/testOpencv/testOpencv/lena.jpg|}" ); if (parser.has("help")) { help(); return 0; } cascadeName = parser.get<string>("cascade"); nestedCascadeName = parser.get<string>("nested-cascade"); scale = parser.get<double>("scale"); if (scale < 1) scale = 1; tryflip = parser.has("try-flip"); inputName = parser.get<string>("@filename"); if (!parser.check()) { parser.printErrors(); return 0; } if (!nestedCascade.load(nestedCascadeName)) cerr << "WARNING: Could not load classifier cascade for nested objects" << endl; if (!cascade.load(cascadeName)) { cerr << "ERROR: Could not load classifier cascade" << endl; help(); return -1; } if (inputName.empty() || (isdigit(inputName[0]) && inputName.size() == 1)) { int camera = inputName.empty() ? 0 : inputName[0] - '0'; //不为空则打开的视频 ,如果打开摄像头可以填0,表示打开默认的摄像头 if (!capture.open(camera)) cout << "Capture from camera #" << camera << " didn't work" << endl; } else if (inputName.size()) // 文件名不为空,不为摄像头和视频,则默认为图片 { image = imread(inputName, 1); if (image.empty()) { if (!capture.open(inputName)) cout << "Could not read " << inputName << endl; } } else //不能打开,则检测 lene 图片 { image = imread("E:/VS2015WorkSpace/testOpencv/testOpencv/lena.jpg", 1); if (image.empty()) cout << "Couldn't read lena.jpg" << endl; } if (capture.isOpened()) //若摄像头打开,则检测每一帧,直到按下 Q 键为止 { cout << "Video capturing has been started ..." << endl; for (;;) { capture >> frame; if (frame.empty()) break; Mat frame1 = frame.clone(); detectAndDraw(frame1, cascade, nestedCascade, scale, tryflip); char c = (char)waitKey(10); if (c == 27 || c == 'q' || c == 'Q') break; } } else { cout << "Detecting face(s) in " << inputName << endl; if (!image.empty()) { detectAndDraw(image, cascade, nestedCascade, scale, tryflip); waitKey(0); } else if (!inputName.empty()) { /* assume it is a text file containing the list 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); 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, tryflip); char c = (char)waitKey(0); if (c == 27 || c == 'q' || c == 'Q') break; } else { cerr << "Aw snap, couldn't read image " << buf << endl; } } fclose(f); } } } return 0; } void detectAndDraw(Mat& img, CascadeClassifier& cascade, CascadeClassifier& nestedCascade, double scale, bool tryflip) { double t = 0; vector<Rect> faces, faces2; const static Scalar colors[] = //颜色选择结构,不同人脸用不同颜色标记 { Scalar(255,0,0), Scalar(255,128,0), Scalar(255,255,0), Scalar(0,255,0), Scalar(0,128,255), Scalar(0,255,255), Scalar(0,0,255), Scalar(255,0,255) }; Mat gray, smallImg; cvtColor(img, gray, COLOR_BGR2GRAY); double fx = 1 / scale; resize(gray, smallImg, Size(), fx, fx, INTER_LINEAR); equalizeHist(smallImg, smallImg); t = (double)getTickCount(); cascade.detectMultiScale(smallImg, faces, 1.1, 3, 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, 3, 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)getTickCount() - t; printf("detection time = %g ms\n", t * 1000 / getTickFrequency()); //标记人脸面部+面部特征 for (size_t i = 0; i < faces.size(); i++) { Rect r = faces[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, 2, 8, 0); } else rectangle(img, Point(cvRound(r.x*scale), cvRound(r.y*scale)), Point(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 (size_t j = 0; j < nestedObjects.size(); j++) { Rect nr = nestedObjects[j]; 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, 2, 8, 0); } } imshow("result", img); } static void detectEyes(Mat&, vector<Rect_<int> >&, string) { } static void detectNose(Mat&, vector<Rect_<int> >&, string) { } static void detectMouth(Mat&, vector<Rect_<int> >&, string) { }
评论
    相关推荐
    • opencv人脸检测
      使用opencv技术检测图片中的人脸,程序有些许不足,不喜勿下!
    • opencv人脸检测
      开发平台VC6.0,OPENCV,人脸检测,检测出来用一框框出来,不错,值得学习
    • 人脸检测 opencv VS2013
      人脸检测 opencv VS2013 完整项目文件 详细注释
    • opencv 人脸检测
      选用vs2008配置opencv2.4.4,在图片上检测人脸,并输出所检测到的人脸的个数。适合初学者练习使用opencv做人脸检测
    • OpenCv人脸检测
      Opencv 进行人脸检测,对于openCv进行更加深入的学习,慢慢来吧,有问题找我把
    • opencv人脸检测
      人脸检测,替换相应XML文件,修改代码来实现全身,上半身,下半身识别。
    • opencv人脸检测
      opencv从摄像头中检测人脸,各位童鞋,是检测不是识别,请勿看错了!
    • opencv 人脸检测
      opencv实现人脸检测,以及眼睛、鼻、嘴的检测和角点检测,包括源代码,参考文献和一个说明文档。
    • OPENCV人脸检测
      OPENCV人脸检测,OpenCV的人脸检测主要是调用训练好的cascade(Haar分类器)来进行模式匹配。
    • 人脸检测 opencv adaboost
      人脸检测 opencv adaboost 已调试通过