基于Opencv的人脸识别


前言

人脸识别算法用的是Eigenface算法。 Eigenface算法原理:计算平均脸->计算协方差矩阵->计算特征值->计算特征矩阵->得到特征脸->将图片与特征脸对比识别人脸。

一、对象检测初始化

定义一个CascadeClassifier对像来检测人脸,先使用load方法初始化,初始化时要用到haar的特征人脸识别分类器。

string haar_face_datapath = "C:/opencv/build/etc/haarcascades/haarcascade_frontalface_alt_tree.xml";//检测人脸
CascadeClassifier faceDetector;//CascadeClassifier对象检测
faceDetector.load(haar_face_datapath);//初始化

二、获取样本

先使用VideoCapture捕捉摄像头中的人脸,将从摄像头中得到的源图像存储到Mat格式的变量中,然后使用detectMultiScale进行多尺度目标检测,将源图像中的人脸识别出来,并用Rect类型的vector存储检测出来的人脸的矩形轮廓。
将检测出来的人脸使用resize函数,按照矩形轮廓截取,并使用imwrite保存下来。
接下来是训练和识别人脸,我将上一步检测出来的人脸,全部按照路径加人物编号的方式存储到了一个csv文件中,方便读取。

VideoCapture capture(0);//0表示打开摄像头,如果是路径表示读取视频
if (!capture.isOpened())
{
   
	cout << "could not open camera" << endl;
	return -1;
}
Mat frame;
vector<Rect> faces;//Rect矩形坐标
int count = 0;//计算人脸数
while (capture.read(frame))//read按帧读取图像,保存到frame中
{
   
	flip(frame, frame, 1);//flip用于反转图像,参数一:原始图像,参数二:变换后的图像,参数三:反转模式,1表示水平翻转
	//detectMultiScale进行多尺度目标检测,frame摄像头得出来的源图像,faces检测出的物体的边缘
	faceDetector.detectMultiScale(frame, faces, 1.1,1,0,Size(100,120),Size(380,400));
	for (int i = 0; i < faces.size(); i++)
	{
   
		if (count % 10 == 0)
		{
   
			Mat dst;
			resize(frame(faces[i]), dst, Size(100, 100));//调整图片大小。frame(faces[i])重载"()"操作符函数
			imwrite(format("C:/Users/18218/source/repos/facerecog_01/outimage/face_%d.jpg",count),dst);
		}
		rectangle(frame, faces[i], Scalar(0, 0, 255), 2, 8, 0);//画红色矩形框
	}
	imshow("camera-demo", frame);
	char c = waitKey(10);//waitKey(10)表示延时10ms切换到下一帧图像
	if (c == 27)//esc键对应的ASCLL码是27
		break;
	count++;
}
capture.release();

三、读取样本

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫璃Moly

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值