【opencv基础】detectMultiScale函数详解及分类器置信度

前言

简单的人脸检测程序可以直接基于opencv的函数库进行实现,本文介绍一下detectMultiScale函数。

函数简介

opencv2人脸检测使用的是detectMultiScale函数,可以检测出图片中的所有人脸,并将vector类型保存各个人脸的位置和大小,用矩形Rect类表示,该函数由分类器的对象进行调用。

Haar特征分类器

Haar特征分类器就是一个XML文件,是opencv官方训练好的检测器,可以直接调用,存放在opencv的安装目录下。

.\opencv\sources\data\haarcascades

函数详解

不同版本的调用函数可能会有些微差别,可以查看函数的声明等。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() );

    CV_WRAP virtual void detectMultiScale( const Mat& image,
                                   CV_OUT vector<Rect>& objects,
                                   vector<int>& rejectLevels,
                                   vector<double>& levelWeights,
                                   double scaleFactor=1.1,
                                   int minNeighbors=3, int flags=0,
                                   Size minSize=Size(),
                                   Size maxSize=Size(),
                                   bool outputRejectLevels=false );

rejectLevels:

levelWeights:

还有一个版本

void cv::CascadeClassifier::detectMultiScale( InputArray image,
                                      std::vector< Rect > &     objects,
                                      std::vector< int > &     numDetections,
                                      double     scaleFactor = 1.1,
                                      int     minNeighbors = 3,
                                      int     flags = 0,
                                      Size     minSize = Size(),
                                      Size     maxSize = Size() );    

 示例

        faces = det.detectMultiScale3(img, 1.3, 3, 0, minSize=(100,100), maxSize=(200, 200), outputRejectLevels=True)
        rects = faces[0]  # face bbox
        neighbours = faces[1]  # level
        weights = faces[2] # score
# For each resulting detection, levelWeights will then contain the certainty of classification at the final stage. This value can then be used to separate strong from weaker classifications.
置信度的数值范围可能大于1,DMS单人脸检测时可以取置信度最高的那个bbox作为人脸区域;竟然还有负值???
置信度1.5以上,姿态角相对较小,小于1.5的一般姿态角太大,landmarks的可信度较低;
 

参考

1.opencv官网

2.opencv例程

posted on 2018-09-28 15:17  鹅要长大  阅读(4211)  评论(0编辑  收藏  举报

导航