利用opencv的detector检测并保存截取的人脸图像
2015-11-06 19:20
519 查看
通常在进行人脸提特征之前,会先检测ROI区域,利用opencv的cascade类可以检测人脸,并截取保存为制定路径和文件名(listNew),要保持原文件名,需更改路径,如下:
参考文献,《opencv3编程入门》毛星云
#include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #include<direct.h> #include<sstream> #include<string> #include<fstream> using namespace std; using namespace cv; String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; String lefteye_cascade_name = "haarcascade_mcs_lefteye.xml"; String righteye_cascade_name = "haarcascade_mcs_righteye.xml"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; CascadeClassifier lefteye_cascade; CascadeClassifier righteye_cascade; void detectAndDisplay(Mat frame, int &num,string szNewPath); int main(void) { if (!face_cascade.load(face_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; if (!eyes_cascade.load(eyes_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; if (!lefteye_cascade.load(lefteye_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; if (!righteye_cascade.load(righteye_cascade_name)){ printf("--(!)Error loading\n"); return -1; }; _mkdir("images"); int num = 0; string strList = "list.txt"; string strListNew = "listNEW.txt"; ifstream ifsList(strList.c_str()); ifstream ifsListNew(strListNew.c_str()); if (ifsList.fail()) { printf("open list failed\n"); return -1; } if (ifsListNew.fail()) { printf("open listNew failed\n"); return -1; } //nNum = 0; char szPath[256]; char szNewPath[256]; while (!ifsList.eof()) { memset(szPath, 0, sizeof(char)* 256); ifsList >> szPath; memset(szNewPath, 0, sizeof(char)* 256); ifsListNew >> szNewPath; Mat img = imread(szPath); if (!img.empty()) { detectAndDisplay(img, num,szNewPath); } else { printf(" --(!) No captured frame -- Break!"); break; } int c = waitKey(10); if ((char)c == 'c') { break; } } return 0; } void detectAndDisplay(Mat frame, int &num,string szNewPath) { std::vector<Rect> faces; Mat frame_gray; cvtColor(frame, frame_gray, COLOR_BGR2GRAY); equalizeHist(frame_gray, frame_gray); face_cascade.detectMultiScale(frame_gray, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); Mat out; for (size_t i = 0; i < faces.size(); i++) { Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2); // ellipse( frame, center, Size( faces[i].width/2, faces[i].height/2), 0, 0, 360, Scalar( 255, 0, 255 ), 2, 8, 0 ); out = frame(Rect(faces[i].x, faces[i].y, faces[i].width, faces[i].height));//my add code Mat faceROI = frame_gray(faces[i]); std::vector<Rect> eyes; std::vector<Rect> lefteye; //-- 在脸中检测眼睛 //OpenCV2: // eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) ); //OpenCV3: eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); lefteye_cascade.detectMultiScale(faceROI, lefteye, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); for (size_t j = 0; j < lefteye.size(); j++) { Point eye_center(faces[i].x + lefteye[j].x + lefteye[j].width / 2, faces[i].y + lefteye[j].y + lefteye[j].height / 2); //int radius = cvRound((lefteye[j].width + lefteye[j].height)*0.25); cout << eye_center << endl; // circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 3, 8, 0 ); } for (size_t j = 0; j < eyes.size(); j++) { Point eye_center(faces[i].x + eyes[j].x + eyes[j].width / 2, faces[i].y + eyes[j].y + eyes[j].height / 2); int radius = cvRound((eyes[j].width + eyes[j].height)*0.25); // circle( frame, eye_center, radius, Scalar( 255, 0, 0 ), 3, 8, 0 ); } } //imshow(window_name, frame); //stringstream ss; //ss << num; //string s = ss.str(); //s = "images\\" + s + ".jpg"; //imwrite(szNewPath, out); num++; }
参考文献,《opencv3编程入门》毛星云
相关文章推荐
- centOS 6.7 中安装matlab R2014b
- Linux 中十个权限字符
- Openstack api 学习文档 & restclient使用文档
- hdu5336XYZ and Drops bfs模拟
- 王高利:Linux针对Red Hat Enterprise Linux 6.5 的防火墙详细讲解,iptables(netfilter)规则的
- expect spawn、linux expect 用法
- 学习linux之用mail命令发邮件
- 编译器架构的王者LLVM——(1)现代编译器架构
- 在linux中添加ftp用户,并设置相应的权限
- centos7 安装hadoop-cdh-2.6
- nginx [warn]: conflicting server name on 0.0.0.0:80 ignored
- linux vim .bashrc 配置以及一些常用的linux 命令解析
- Linux下/proc目录简介
- 批量执行shell命令
- 批量执行shell命令
- 如何在Linux下安装启动多个Tomcat
- eclipse tomcat maven项目布署的一些问题解决方法
- 网站架构演变结构示意图
- Ceph 集群监控之Calamari 安装部署
- Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解