主要用到了objdetect
模块,参考链接。
#include <iostream>
#include <opencv2/objdetect.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
using namespace std;
using namespace cv;
int main(int argc, char *argv[])
{
Mat image, image_gray; //定义两个Mat变量,用于存储每一帧的图像
VideoCapture capture;
capture.open(0); //从摄像头读入视频
while (1) //循环显示每一帧
{
capture >> image; //读取当前帧
cvtColor(image, image_gray, COLOR_BGR2GRAY);//转为灰度图
equalizeHist(image_gray, image_gray);//直方图均衡化,增加对比度方便处理
CascadeClassifier eye_Classifier; //载入分类器
CascadeClassifier face_cascade; //载入分类器
//加载分类训练器,OpenCv官方文档提供的xml文档,可以直接调用
//xml文档路径 opencv\sources\data\haarcascades
if (!eye_Classifier.load("/home/yijiull/OpenCV/opencv/data/haarcascades/haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下
{
cout << "Load haarcascade_eye.xml failed!" << endl;
return 0;
}
if (!face_cascade.load("/home/yijiull/OpenCV/opencv/data/haarcascades/haarcascade_frontalface_alt.xml"))
{
cout << "Load haarcascade_frontalface_alt failed!" << endl;
return 0;
}
vector<Rect> eyeRect;
vector<Rect> faceRect;
//检测
face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30));//检测
for (size_t i = 0; i < faceRect.size(); i++)
{
Point center(faceRect[i].x + faceRect[i].width / 2, faceRect[i].y + faceRect[i].height / 2);
ellipse(image, center, Size(faceRect[i].width / 2, faceRect[i].height / 2), 0, 0, 360, Scalar(255, 0, 255), 4);
Mat ROI = image_gray(faceRect[i]);
eye_Classifier.detectMultiScale(ROI, eyeRect);//检测
for (size_t j = 0; j < eyeRect.size(); j++)
{
Point eyeCenter(faceRect[i].x + eyeRect[j].x + eyeRect[j].width / 2, faceRect[i].y + eyeRect[j].y + eyeRect[j].height / 2);
int redius = cvRound((eyeRect[j].width + eyeRect[j].height) * 0.25);
circle(image, eyeCenter, redius, Scalar(255, 0, 0), 4);
}
}
imshow("人脸识别图", image); //显示当前帧
char c = waitKey(30); //延时30ms,即每秒播放33帧图像
if (c == 27) break;
}
return 0;
}