linux下人脸检测程序

时间:2023-02-22 08:22:14

代码功能,静态定位人脸,以及眼睛,并将定位过的人脸区域保存成新的图像。

#include "opencv2/core/core.hpp"

#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; 
string face_cascade_name = "haarcascade_frontalface_alt.xml";
string eye_cascade_name =  "haarcascade_eye_tree_eyeglasses.xml";
//该文件存在于OpenCV安装目录下的\sources\data\haarcascades内,需要将该xml文件复制到当前工程目录下
CascadeClassifier face_cascade;
CascadeClassifier eyes_cascade;
void detectAndDisplay(Mat frame);
int main(int argc, char** argv){
Mat image;
image = imread("image11.jpg");//当前工程的image目录下的mm.jpg文件,注意目录符号
if(!face_cascade.load(face_cascade_name)){
printf("级联分类器错误,可能未找到文件,拷贝该文件到工程目录下!\n");
return -1;
}
if(!eyes_cascade.load(eye_cascade_name)){
printf("级联分类器错误,可能未找到文件,拷贝该文件到工程目录下!\n");
return -1;
}
detectAndDisplay(image);//调用人脸检测函数
waitKey(0);
//暂停显示一下
return 0;
}


void detectAndDisplay(Mat face){
vector<Rect> faces;
Mat face_gray;


cvtColor(face, face_gray, CV_RGB2GRAY);//rgb类型转换为灰度类型
equalizeHist(face_gray, face_gray);//直方图均衡化


face_cascade.detectMultiScale(face_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(1, 1));


// for(int i=0;i<faces.size();i++){
// Point center(faces[i].x + faces[i].width*0.5, faces[i].y+faces[i].height*0.5);
// ellipse(face, center, Size(faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar(0, 0, 255), 3, 7, 0);
//}


for(int i=0; i<faces.size(); i++){
rectangle(face, Rect(faces[0].x, faces[0].y, faces[0].width, faces[0].height), Scalar(0, 0, 255), 3, 8, 0);

// Mat colorROI = face(faces[i]);
Mat faceROI = face_gray(faces[i]);
vector<Rect> eyes;
eyes_cascade.detectMultiScale(faceROI, eyes, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30));


for(int j=0; j<eyes.size(); j++){
Point center( faces[i].x+eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5);
int radius = cvRound((eyes[j].width + eyes[i].height)*0.25);
circle(face, center, radius, Scalar(0,0,255), 2, 8, 0);
}


imwrite("10.pgm",faceROI);


}


imshow("face", face);
}