【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   鹅要长大  阅读(4450)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示