OpenCV 4.11.0
开源计算机视觉库
|
下面描述的目标检测器最初由Paul Viola [285]提出,并由Rainer Lienhart [167]改进。
首先,使用数百个特定目标(例如人脸或汽车)的样本视图(称为正样本),这些样本视图被缩放至相同大小(例如20x20),以及相同大小的负样本(任意图像)来训练一个分类器(即一个基于Haar-like特征的增强型级联分类器)。
训练好分类器后,可以将其应用于输入图像中感兴趣区域(与训练期间使用的大小相同)。如果该区域可能显示目标(例如人脸/汽车),则分类器输出“1”,否则输出“0”。为了在整个图像中搜索目标,可以将搜索窗口在图像上移动,并使用分类器检查每个位置。分类器设计为可以轻松“调整大小”,以便能够找到不同大小的目标,这比调整图像本身更有效。因此,为了在图像中找到未知大小的目标,应该在不同的比例下多次进行扫描过程。
分类器名称中的“级联”一词意味着生成的分类器由多个更简单的分类器(阶段)组成,这些分类器会依次应用于感兴趣区域,直到在某个阶段拒绝候选对象或通过所有阶段为止。“增强型”一词表示级联中每个阶段的分类器本身很复杂,它们是使用四种不同的增强技术(加权投票)中的一种,由基本分类器构建而成。目前支持离散Adaboost、实数Adaboost、Gentle Adaboost和Logitboost。基本分类器是至少具有2个叶节点的决策树分类器。Haar-like特征是基本分类器的输入,其计算方法如下所述。当前算法使用以下Haar-like特征:
在特定分类器中使用的特征由其形状(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>