一、案例
1.下列是完整的案例代码(含注解)。
#include<iostream>
#include<opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
using namespace cv;
using namespace std;
//人脸识别函数
void datectFace(Mat& frame, CascadeClassifier cascade, double scale)
{
Mat gray;
cvtColor(frame, gray, CV_RGB2GRAY); //颜色通道转换
Mat RecognitionFace(cvRound(frame.rows / scale), cvRound(frame.cols / scale), CV_8UC1); //灰度图行列压缩
resize(gray, RecognitionFace, RecognitionFace.size(), 0, 0, INTER_LINEAR); //采用线性方式压缩
equalizeHist(RecognitionFace, RecognitionFace); 灰度图转直方图函数处理
imshow("RecognitionFace", RecognitionFace); //灰度图显示
//使用CV_HAAR_SCALE_IMAGE算法 图像甄别
vector<Rect>faces;
cascade.detectMultiScale(RecognitionFace, faces, 1.1, 2, 0 | CASCADE_SCALE_IMAGE, Size(30, 30)); //人脸检测函数:detectMultiScale
//绘制矩形
vector<Rect>::const_iterator iter;
for (iter = faces.begin(); iter != faces.end(); iter++)
{
rectangle(frame,
cvPoint(cvRound(iter->x * scale), cvRound(iter->y * scale)),//左上
cvPoint(cvRound((iter->x + iter->width) * scale), cvRound((iter->y + iter->height) * scale)),//右下
Scalar(0, 255, 0), 2, 8//颜色 像素位
);
}
imshow("frame", frame);
}
int main(int argc, char* argv[])
{
CascadeClassifier cascade;
cascade.load("haarcascade_frontalface_default.xml"); //添加人脸模式
Mat frame;
VideoCapture capture(0); //打开摄像头
if (!capture.isOpened())
{
cout << "无法打开摄像头" << endl;
return -1;
}
while (capture.read(frame))
{
imshow("frame", frame); //显示
datectFace(frame, cascade, 2);
if (waitKey(30) >= 0) break; // 等待按键输入,按下任意键退出循环
}
return 0;
}
二、效果
1.这里注意一下,opneCV自带有模型,直接复制到创建的文件下就好了。
2.模型用途
3.操作看下图。
4.识别效果