opencv 级联分类器,人脸检测
本章内容:
* 1.人脸识别
* 2.人眼识别
输出结果
源码
//#include <QCoreApplication>
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>int main(int argc, char *argv[])
{
/*本章内容:
* 1.人脸识别
* 2.人眼识别
*/
cv::VideoCapture vCap;
vCap.open(0);
if(!vCap.isOpened()){
std::cout << "视频已经被占用" << std::endl;
return -1;
}
cv::Mat frame;
cv::Mat gray;
int key;
// 创建级连分类器
cv::CascadeClassifier face_cascade;
cv::CascadeClassifier eye_cascade;
std::vector<cv::Rect> faceFrames;
std::vector<cv::Rect> eyeFrames;
if(!face_cascade.load("/home/wang/opencv/opencv/data/haarcascades/haarcascade_frontalface_alt.xml")){
std::cout << "人脸识别级联分类器打开失败" << std::endl;
return -1;
}
if(!eye_cascade.load("/home/wang/opencv/opencv/data/haarcascades/haarcascade_eye.xml")){
std::cout << "人眼识别级联分类器打开失败" << std::endl;
return -1;
}
std::cout << "进入人脸识别" << std::endl;
while(1){
key= cv::waitKey(100);
if((key == 'q') || (key == 'Q')) break;bool ret = vCap.read(frame);
if (!ret) { std::cout << "读取视频是失败" << std::endl; continue; }
cv::cvtColor(frame,gray,cv::COLOR_BGR2GRAY);
cv::equalizeHist(gray,gray);
face_cascade.detectMultiScale(gray,faceFrames,1.2,3,0,cv::Size(30,30));
for(int i=0;i<faceFrames.size();i++){
cv::Rect roi;
roi.x = faceFrames[i].x;
roi.y = faceFrames[i].y;
roi.width = faceFrames[i].width;
roi.height = faceFrames[i].height;
cv::Mat face = frame(roi);
eye_cascade.detectMultiScale(face,eyeFrames,1.3,3,0,cv::Size(20,20));
for(int j=0;j<eyeFrames.size();j++){
cv::Rect eyeROI;
eyeROI.x += eyeFrames[j].x + faceFrames[j].x;
eyeROI.y += eyeFrames[j].y + faceFrames[j].y;
eyeROI.width += eyeFrames[j].width;
eyeROI.height += eyeFrames[j].height;
cv::rectangle(frame,eyeROI,cv::Scalar(0,255,0),2);
}cv::rectangle(frame,faceFrames[i],cv::Scalar(0,0,255),2);
}
cv::imshow("VideoCapture", frame);
}
vCap.release();
std::cout << "按任意键退出" << std::endl;
cv::waitKey(0);
return 1;
}