您的位置:首页 > 运维架构

利用opencv的detector检测并保存截取的人脸图像

2015-11-06 19:20 519 查看
通常在进行人脸提特征之前,会先检测ROI区域,利用opencv的cascade类可以检测人脸,并截取保存为制定路径和文件名(listNew),要保持原文件名,需更改路径,如下:

#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编程入门》毛星云
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: