OpenCv 之(图片人脸识别)和 (摄像头读入)
2018-02-22 12:28
615 查看
先来张人脸识别效果图:
1、
4000
概述
人脸识别,是基于人的脸部特征信息进行身份识别的一种生物识别技术。用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部的一系列相关技术,通常也叫做人像识别、面部识别。
2、人脸识别步骤
1 人脸图像采集及检测 2 人脸图像预处理 3 人脸图像特征提取以及匹配与识别
3、 人脸识别的方法
在OpenCV中主要使用了两种特征(即两种方法)进行人脸检测,Haar特征和LBP特征。使用已经训练好的XML格式的分类器进行人脸检测。在OpenCV的安装目录下的sources文件夹里的data文件夹里可以看到下图所示的内容(opencv\sources\data\haarcascades ):
文件夹的名字“haarcascades”、“hogcascades”和“lbpcascades”分别表示通过“haar”、“hog”和“lbp”三种不同的特征而训练出的分类器:"haar"特征主要用于人脸检测,“hog”特征主要用于行人检测,“lbp”特征主要用于人脸识别,“eye”特征主要用于眼睛的检测识别。 实现人脸检测主要依赖于detectMultiScale()函数,下面简单说一下函数参数的含义,先看函数原型:
CV_WRAP virtual void detectMultiScale( const Mat& image, CV_OUT vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size() );
各参数含义: const Mat& image: 需要被检测的图像(灰度图) vector<Rect>& objects: 保存被检测出的人脸位置坐标序列 double scaleFactor: 每次图片缩放的比例 int minNeighbors: 每一个人脸至少要检测到多少次才算是真的人脸 int flags: 决定是缩放分类器来检测,还是缩放图像 Size(): 表示人脸的最大最小尺寸
4、源代码分析
(1)检测图片中的人脸
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/calib3d/calib3d.hpp> using namespace std; using namespace cv; int main() { Mat image, image_gray; //定义两个Mat变量,用于存储每一帧的图像 image = imread("F://1.png"); imshow("原图", image); cvtColor(image, image_gray, CV_BGR2GRAY);//转为灰度图 equalizeHist(image_gray, image_gray);//直方图均衡化,增加对比度方便处理 CascadeClassifier eye_Classifier; //载入分类器 CascadeClassifier face_cascade; //载入分类器 //加载分类训练器,OpenCv官方文档提供的xml文档,可以直接调用 //xml文档路径 opencv\sources\data\haarcascades if (!eye_Classifier.load("F:\\haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下 { cout << "Load haarcascade_eye.xml failed!" << endl; return 0; } if (!face_cascade.load("F:\\haarcascade_frontalface_alt.xml")) { cout << "Load haarcascade_frontalface_alt failed!" << endl; return 0; } //vector 是个类模板 需要提供明确的模板实参 vector<Rect>则是个确定的类 模板的实例化 vector<Rect> eyeRect; vector<Rect> faceRect; //检测关于眼睛部位位置 eye_Classifier.detectMultiScale(image_gray, eyeRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); for (size_t eyeIdx = 0; eyeIdx < eyeRect.size(); eyeIdx++) { rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255)); //用矩形画出检测到的位置 } //检测关于脸部位置 face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30)); for (size_t i = 0; i < faceRect.size(); i++) { rectangle(image, faceRect[i], Scalar(0, 0, 255)); //用矩形画出检测到的位置 } imshow("人脸识别图", image); //显示当前帧 waitKey(0); } return 0; }
(2)检测摄像头中的人脸
#include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/calib3d/calib3d.hpp> using namespace std; using namespace cv; int main() { Mat image, image_gray; //定义两个Mat变量,用于存储每一帧的图像 VideoCapture capture(0); //从摄像头读入视频 while (1) //循环显示每一帧 { capture >> image; //读取当前帧 //image = imread("F://1.png"); //imshow("原图", image); cvtColor(image, image_gray, CV_BGR2GRAY);//转为灰度图 equalizeHist(image_gray, image_gray);//直方图均衡化,增加对比度方便处理 CascadeClassifier eye_Classifier; //载入分类器 CascadeClassifier face_cascade; //载入分类器 //加载分类训练器,OpenCv官方文档提供的xml文档,可以直接调用 //xml文档路径 opencv\sources\data\haarcascades if (!eye_Classifier.load("F:\\haarcascade_eye.xml")) //需要将xml文档放在自己指定的路径下 { cout << "Load haarcascade_eye.xml failed!" << endl; return 0; } if (!face_cascade.load("F:\\haarcascade_frontalface_alt.xml")) { cout << "Load haarcascade_frontalface_alt failed!" << endl; return 0; } //vector 是个类模板 需要提供明确的模板实参 vector<Rect>则是个确定的类 模板的实例化 vector<Rect> eyeRect; vector<Rect> faceRect; //检测关于眼睛部位位置 eye_Classifier.detectMultiScale(image_gray, eyeRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));//检测 for (size_t eyeIdx = 0; eyeIdx < eyeRect.size(); eyeIdx++) { rectangle(image, eyeRect[eyeIdx], Scalar(0, 0, 255)); //用矩形画出检测到的位置 } //检测关于脸部位置 face_cascade.detectMultiScale(image_gray, faceRect, 1.1, 2, 0 | CV_HAAR_SCALE_IMAGE, Size(30, 30));//检测 for (size_t i = 0; i < faceRect.size(); i++) { rectangle(image, faceRect[i], Scalar(0, 0, 255)); //用矩形画出检测到的位置 } imshow("人脸识别图", image); //显示当前帧 char c = waitKey(30); //延时30ms,即每秒播放33帧图像 if (c == 27) break; } return 0; }
效果图:
人脸识别源代码下载链接
相关文章推荐
- opencv实现人脸识别中过曝光人脸图片处理
- (人脸识别2-1)——利用opencv打开摄像头
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- 人脸识别系统开发(6) -- OpenCV摄像头预览
- python-opencv-人脸识别实现 从图片中扣人脸
- MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)
- 基于python3 OpenCV3实现静态图片人脸识别
- OpenCV读取图片,从摄像头读入视频,从文件夹中读入视频
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- Opencv之摄像头人脸识别
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- OpenCV入门十:静态图片人脸检测和摄像头人脸检测
- MFC中利用Opencv与C++抓取摄像头进行人脸识别(Mat)
- opencv2-5利用摄像头进行人脸识别
- Opencv摄像头实时人脸识别
- opencv-python 基本例子3个---显示图片,绘制图形,人脸识别
- 基于OpenCV读取摄像头进行人脸检测和人脸识别
- OpenCV-Python 摄像头实时识别人脸
- 代码C++, opencv实现人脸识别,人脸检测,人脸匹配,视频中的人脸检测,摄像头下的人脸检测等
- python利用Opencv进行人脸识别(视频流+图片)