opencv的人脸识别

首先呢,在使用源代码编译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;
}

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/81131184