首先呢,在使用源代码编译opencv的时候只要有Python环境那么会下载一个人脸识别的模型,这个是已经训练好的模型,如果需要自己训练模型,那么很简单:使用https://customvision.ai便可以训练出自己的识别模型了,算是一个比较简单的方法了!
接下来我们开始使用已经训练好的模型,这个模型的文件名是haarcascade_frontalface.xml或者haarcascade_frontalface_all.xml:
如果电脑中没有这个模型,那么下载一个到电脑上就行了!
接下来只需要,引入opencv的动态库的头文件即可:(只有my_face函数才是,其他函数只是opencv的一些测试,就当我在凑代码量了!!)
#include <iostream>
#include <opencv2\opencv.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
using namespace cv;
using namespace std;
//合并图像
void merge_img()
{
Mat image = imread("a.jpg");
namedWindow("原图");
imshow("原图", image);
Mat logo = imread("c.jpg");
namedWindow("logo图");
imshow("logo图", logo);
Mat imageROI = image(Rect(100, 100, logo.cols, logo.rows));
addWeighted(imageROI, 0.1, logo, 0.3, 0, imageROI);
namedWindow("新图");
imshow("新图", image);
}
//图像灰度化
void grayscale_img()
{
Mat image = imread("a.jpg");
imshow("原图",image);
//CV_LOAD_IMAGE_GRAYSCALE 如果取这个标识的话,始终将图像转换成灰度1
Mat image_g = imread("a.jpg", CV_LOAD_IMAGE_GRAYSCALE);
imwrite("b.jpg", image_g);
imshow("灰度图",image_g);
}
//人脸识别的使用
int my_face(){
//1、加载人脸识别模型
CascadeClassifier face;
if (!face.load("D:\\Python36\\haarcascade_frontalface.xml")){
cout << "加载人脸模型失败" << endl;
return -1;
}
cout << "加载人脸模型成功" << endl;
//2、打开摄像头
VideoCapture capture;
capture.open(0);
//3、实时监听摄像头画面
Mat frame;
//read():实时从摄像头读取一帧画面
while (capture.read(frame)){
//判断图片是否存在
if (frame.empty()){
break;
}
//4. 将图片灰度化,提高效率
Mat frame_gray;
//彩色转为灰色
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);
//5.根据提供的人脸模型检测摄像头画面是否存在人脸(匹配)
//一张图片中可能存在多张人脸
vector<Rect> faces;
//Size表示最小值,人脸太小了就不执行检测了(其他为默认参数)
face.detectMultiScale(frame_gray, faces, 1.1, 3, 0, Size(100, 100));
//6.将检测的人脸进行标记
for (size_t i = 0; i < faces.size(); i++){
//将所有的人脸进行标记(在此使用圆形进行标记)
//在图片上的人脸位置绘制圆形
//(1)找到圆的中心点坐标 已知两点求中心点
Point center(faces[i].x + faces[i].width / 2, faces[i].y + faces[i].height / 2);
//(2)根据圆心坐标绘制圆形
//参数一:摄像头画面
//参数二:中心点
//参数三:半径
//参数四:旋转角度
//参数五:起始位置
//参数六:结束位置
//参数七:圆环的颜色
//参数八:圆环的大小(如果小于0,则为实心圆,大于0则为空心圆,值越大则圆环越粗)
ellipse(frame, center, Size(faces[i].width / 2, faces[i].height / 2), 0, 0, 360,Scalar(0,0,255) ,3);
}
//7.显示到窗口上
imshow("人脸识别", frame);
//8.等待,实时刷新人脸,每隔5mms检测一次
waitKey(5);
}
}
int main(){
//grayscale_img();
my_face();
//waitKey(0);
return 0;
}