Cascade Classifier 用做人脸识别的方法及例程


Cascade Classifier 是Opencv中一个级联分类器,我学习Opencv的过程中,做了些笔记还有翻译了一些指导书。可供需要的人士参考,因本人学历不高。翻译中肯定要不到位、不准确的地方,还望网友们多多指点 一二,共同学习嘛!

本文的例程见以下链接:
(http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html)

也可以在文章的后尾下载包含图片及.xml文件的例程。例程中也可以打开摄像头执行拍照识别,只需打开即可实现摄像头拍照:

<span style="color: rgb(68, 68, 68); font-family: 'Source Code Pro', monospace; font-size: 14px; line-height: 13.533332824707px; white-space: pre; background-color: rgba(128, 128, 128, 0.0470588);">#</span><span class="hljs-keyword" style="color: rgb(68, 68, 68); box-sizing: border-box; font-family: 'Source Code Pro', monospace; font-size: 14px; line-height: 13.533332824707px; white-space: pre; background-color: rgba(128, 128, 128, 0.0470588);">define</span><span style="color: rgb(68, 68, 68); font-family: 'Source Code Pro', monospace; font-size: 14px; line-height: 13.533332824707px; white-space: pre; background-color: rgba(128, 128, 128, 0.0470588);"> CAM 1</span>

好吧,我们先看看识别出来的效果图吧。

Cascade Classifier 用做人脸识别的方法及例程_第1张图片

我个人觉得分类中还未添加眼睛被盖住的时候未能识别出来的情况,图中画圆的头像。本次示例的图片识别率为:

(识别率=19/20x100%=95%)
还是理想状态下

代码分析:

/** Global variables */
String face_cascade_name = "lbpcascade_frontalface.xml";


//导入级联分类器xml文件,并作文件是否存在的判断
if( !face_cascade.load( face_cascade_name ) )
{ 
   printf("--(!)Error loading\n");
   return -1;
}


//-- 2. Read the video stream
      capture.open( 0 );//参数为“0”,表示打开默认的摄像机
     if( capture.isOpened() )
      {
        for(;;)
        {
           //代码段略
        }
      }


** ----------------- 主要代码 ---------- **


   //转换成灰度图
   cvtColor( frame, frame_gray, COLOR_BGR2GRAY );
   //转换直方图
   equalizeHist( frame_gray, frame_gray );


   //-- Detect faces
   face_cascade.detectMultiScale( frame_gray,                      faces,
 6,
 Size(66, 66),
 Size(300, 300) );


** ----------------- 主要函数结构 ----------- **
**CascadeClassifier::detectMultiScale**
C++下的原形: 
void CascadeClassifier::detectMultiScale(
const Mat& image, 
vector<Rect>& objects, 
double
scaleFactor=1.1, 
int minNeighbors=3,
int flags=0,
Size minSize=Size(), 
Size maxSize=Size())


参数:
Image – 原图像;
Object  – 存放检测结果的目标矩阵;
ScaleFactor – 图像衰减比例系数;
minNeighbors – 保留最小目标邻近的长方形;
flags – 仅仅用于旧版本的cascade,新版本未用到。
MinSize  - 最小的目标尺寸,小于这个尺寸将不会检测。
MaxSize – 最大的目标尺寸,大于这个尺寸将不会被检测。


**VideoCapture::open**
C++:有两个原行:
 bool VideoCapture::open(const string& filename)
 bool VideoCapture::open(int device)
参数:
filename - - 打开视频或图片文件的名称,例如video.avi 、img_001.jpg
device - - 设备名称,如:a camera index。Device=0,表示打开默认摄像设备。


**VideoCapture::isOpened**
isopened() - - 调用时返回一个已经初始化好的的设备,正确返回1 ,错误返回非零。
**VideoCapture::release**
release() 关闭并释放设备




**Ellipse**
C++: 原型1:


void ellipse(
Mat& img, 
Point center,
Size axes, 
double angle, 
double startAngle, 
double endAngle,
const Scalar& color, 
int thickness=1, 
int lineType=8, 
int shift=0)


C++: 原型2:
void ellipse(
Mat& img, 
const RotatedRect& box, 
const Scalar& color, 
int thickness=1, 
int line-Type=8)


Img - - 图像
Center – 中心点
Axes - - 半径
Angle - - 中心角度
startAngle - - 起始角度
endAngle - - 终点角度
color - - 颜色
thickness - - 厚度
linetype - - 线型

下载地址


你可能感兴趣的:(Cascade Classifier 用做人脸识别的方法及例程)