OpenCV 4.10.0
开源计算机视觉
|
下面描述的对象检测器最初由 Paul Viola [284] 提出,并由 Rainer Lienhart [167] 改进。
首先,使用数百个特定对象(比如人脸或汽车)的样本视图(称为正面样例),对分类器(即“使用类 Haar 特征的提升分类器的级联”)进行训练,将这些视图调整到相同的大小(比如 20x20)以及相同的负面样例(任意大小的图像)。
在训练分类器之后,可以将其应用于输入图像中感兴趣的区域(与训练期间所用区域大小相同)。如果该区域可能显示对象(比如人脸/汽车),分类器将输出“1”;否则输出“0”。要在整个图像中搜索对象,可以在图像中移动搜索窗口,并使用分类器检查每个位置。该分类器经过设计,可以轻松“调整大小”,以便能够找到不同大小的感兴趣对象,而这比调整图像本身的大小要更有效率。因此,若要在图像中找到一个未知大小的对象,应在不同比例下执行扫描程序多次。
分类器名称中的“级联”一词表示所得分类器由若干个简单的分类器(“阶段”)组成,这些分类器依次应用于某个感兴趣的区域,直到某个阶段拒绝候选者或进入所有阶段。单词“提升”表示,级联中的每个阶段的分类器本身都很复杂,并且由使用四种不同的提升技术(加权投票)的基本分类器构建而成。当前支持离散 AdaBoost、真实 AdaBoost、温和 AdaBoost 和 Logitboost。基本分类器是包含至少 2 个叶子的决策树分类器。类 Haar 特征是基本分类器的输入,计算方法如下。当前算法使用以下类 Haar 特征
特定分类器中使用的特征由它的形状(1a、2b 等)、感兴趣区域内的位置以及尺度指定(该尺度与检测阶段使用的尺度不同,尽管这两个尺度会被相乘)。例如,对于第三层特征(2c),响应计算为覆盖整个特征(包括两个白条和中间的黑条)的矩形下图像像素之和与乘以 3 的黑条下图像像素之和之间的差,以补偿区域大小的差异。使用积分图像(见下文和积分描述)快速计算矩形区域的像素值和。
查阅相应教程以了解更多详细信息。
以下参考仅针对检测部分。有一个单独的应用程序名为 opencv_traincascade,可以根据一组样本训练提升分类器的级联。
类 | |
类 | cv::BaseCascadeClassifier |
类 | cv::CascadeClassifier |
对象检测的级联分类器类。更多信息... | |
结构 | cv::DefaultDeleter< CvHaarClassifierCascade > |
类 | cv::DetectionBasedTracker |
枚举 | |
枚举 | { cv::CASCADE_DO_CANNY_PRUNING = 1 , cv::CASCADE_SCALE_IMAGE = 2 , cv::CASCADE_FIND_BIGGEST_OBJECT = 4 , cv::CASCADE_DO_ROUGH_SEARCH = 8 } |
函数 | |
Ptr< BaseCascadeClassifier::MaskGenerator > | cv::createFaceDetectionMaskGenerator () |
匿名枚举 |
#include <opencv2/objdetect.hpp>
Ptr< BaseCascadeClassifier::MaskGenerator > cv::createFaceDetectionMaskGenerator | ( | ) |
#include <opencv2/objdetect.hpp>