OpenCV学习记录(一):使用haar分类器进行人脸识别
来源:互联网 发布:低成本网络推广 编辑:程序博客网 时间:2024/06/05 00:18
OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。OpenCV2之后的C++接口除了Haar特征以外也可以使用LBP特征。
介绍haar分类器理论知识:
1、http://www.cnblogs.com/ello/archive/2012/04/28/2475419.html(讲的很详细);
2、http://blog.csdn.net/zy1034092330/article/details/48850437(基础理论)
实际使用中原理只要大概懂就行了,如果想深究,可以读读两个链接中的博文。
使用OpenCV中自带的haar分类器识别人脸,其文件在OpenCV安装文件夹如下路径中:
将haarcascade_frontalface_alt.xml文件复制到工程根目录下即可。
代码:
#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;//String my_face_cascade_name = "my_haarcasade_face.xml";String face_cascade_name = "haarcascade_frontalface_alt.xml";CascadeClassifier face_cascade;String window_name = "Capture - face detection";void detectFace(Mat frame);int main(){ VideoCapture capture; Mat frame; //检测是否成功读取人脸的haar分类器,就是那个xml文件 if (!face_cascade.load(my_face_cascade_name)) { cout << "Error: cannot load face casade!!!" << endl; return -1; } capture.open(0);//打开摄像头 //检测摄像头是否成功打开 if (!capture.isOpened()) { cout << "Error: cannot open the camera!!!" << endl; return -1; } namedWindow(window_name);//创建窗口 while (true) { capture >> frame; //从摄像头读入一帧图像 detectFace(frame);//对那帧图像进行处理,识别人脸 //等待按键,若按下esc键,则退出循环 int c = waitKey(10); if (c == 0x1B) break; } return 0;}//从输入图像中检测人脸void detectFace(Mat frame){ Mat frame_gray; vector<Rect> face; cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//转成灰度图像 equalizeHist(frame_gray, frame_gray);//直方图均衡化 //按照文档说明调用函数即可 face_cascade.detectMultiScale(frame_gray, face, 1.1, 2, CASCADE_SCALE_IMAGE, Size(30, 30)); //遍历所有人脸 for (size_t i = 0; i < face.size(); i++) { //根据返回的Rect的x坐标、y坐标、宽width和高height算出中心位置 Point center(face[i].x + face[i].width/2, face[i].y + face[i].height/2); //调用ellipse画出椭圆型边框,指示人脸 ellipse(frame, center, Size(face[i].width/2, face[i].height/2), 0, 0, 360, Scalar(255, 0, 255), 4, 8, 0); } //最后刷新窗口,显示图像 imshow(window_name, frame);}
程序中已经有相关注释,不做赘述。只要环境配置正确,OpenCV2下运行应该不会有错。
简要总结一下CascadeClassifier::detectMultiScale函数的用法:
从文档中摘出来的三种c++下的定义方式:
CascadeClassifier::detectMultiScale
Detects objects of different sizes in the input image. The detected objects are returned as a list of rectangles.C++: void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
C++: void CascadeClassifier::detectMultiScale(InputArray image, vector& objects, vector& numDetections, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())
C++: void CascadeClassifier::detectMultiScale(InputArray image, std::vector& objects, std::vector& rejectLevels, std::vector& levelWeights, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size(), bool outputRejectLevels=false )
只讨论下面这种形式:
C++: void CascadeClassifier::detectMultiScale(InputArray image,
vector& objects, double scaleFactor=1.1, int minNeighbors=3, int
flags=0, Size minSize=Size(), Size maxSize=Size())
参数说明:
1、InputArray image:
输入图像,填Mat类型的图像即可。图像通道数可以是任意的,但图像深度应为CV_8U、CV_16U、CV_16S、CV_32F、CV_64F;
2、std::vector& objects:
为被检测物体的矩形向量组,这里就代表人脸所在范围的矩形向量组;
3、double scaleFactor=1.1:
scaleFactor为图像中的尺度参数,默认取值1.1;
4、int minNeighbors=3:
每一个级联矩形应该保留的邻近个数的最小值,默认为3;
5、int flags=0:
在老版本的OpenCV中,与cvHaarDetectObjects中的这个参数具有相同的含义,新版本中没用,默认取0;
6、Size minSize=Size():
物体的最小大小,指定其大小的最小值,所有小于此的都被忽视掉;
7、Size maxSize=Size():
物体的最大大小,指定其大小的最大值,所有大于此的都被忽视掉;
- OpenCV学习记录(一):使用haar分类器进行人脸识别
- OpenCV学习记录(二):自己训练haar特征的adaboost分类器进行人脸识别
- 用opencv自带的Haar分类器进行人脸检测(一)
- 人脸识别之haar分类器(一)
- opencv自带的haar分类器进行人脸识别
- 【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(一):Haar特征介绍
- 利用OpenCV的Haar特征目标检测方法进行人脸识别的尝试(一)
- opencv haar 分类器记录
- Haar分类器(人脸识别、人眼识别)
- 用opencv自带的Haar分类器进行人脸检测(二)
- 使用Haar特征进行人脸识别
- 人脸识别Haar分类器
- opencv人脸检测(haar特征+AdaBoos分类器)(一)
- opencv的haar特征进行人脸识别
- opencv+Recorder︱OpenCV 中使用 Haar 分类器进行面部检测
- 学习Haar-Like特征和AdaBoost进行人脸识别
- 基于opencv的haar算法以人脸识别为例的训练分类器xml的方法
- OpenCV学习笔记(一):使用CascadeClassifier识别人脸
- Android 多个Fragment切换时,避免重复创建Fragment。
- Cocos2dx-3.x减小空包体方法
- Linux终端内容太多无法全部显示
- 一致性哈希算法(consistent hashing)
- 继承、派生、组合
- OpenCV学习记录(一):使用haar分类器进行人脸识别
- git 配置多个SSH-Key
- 一个与实验楼类似的平台
- BP神经网络
- PHP简明教程-面向对象基础 1
- EPM Hyperion 11.1.2 产品说明及系统架构(转)
- android实现一键切换显示方向
- js面试题
- 精通比特币