![]() |
OpenCV 4.12.0
开源计算机视觉
|
下面描述的目标检测器最初由 Paul Viola [288] 提出,并由 Rainer Lienhart [170] 改进。
首先,分类器(即一个使用 Haar 类似特征的增强分类器级联)使用几百个特定目标的样本视图(例如,人脸或汽车)进行训练,这些样本视图被缩放到相同大小(比如 20x20),以及负样本 - 相同大小的任意图像。
分类器训练完成后,可以将其应用于输入图像中与训练期间使用的大小相同的感兴趣区域。如果该区域可能显示对象(即,人脸/汽车),则分类器输出“1”,否则输出“0”。为了在整个图像中搜索对象,可以将搜索窗口在图像上移动,并使用分类器检查每个位置。分类器的设计使其可以轻松地“调整大小”,以便能够找到不同大小的感兴趣对象,这比调整图像本身的大小更有效。因此,为了在图像中找到未知大小的对象,应该在不同的尺度上多次执行扫描过程。
分类器名称中的“级联”一词表示最终的分类器由几个更简单的分类器(阶段)组成,这些分类器依次应用于感兴趣的区域,直到在某个阶段候选区域被拒绝或所有阶段都已通过。“增强”一词表示级联的每个阶段的分类器本身都很复杂,并且它们是使用四种不同的增强技术之一(加权投票)从基本分类器构建的。目前支持 Discrete Adaboost、Real Adaboost、Gentle 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>