三行 C++ 代码就能检测出人脸。加载模型、传入灰度图、调用detectMultiScale,输出的矩形框就标记了人脸位置。对于大多数开发者来说,理解到这一步就够用了。
但如果你想知道这三行背后到底发生了什么——积分图是如何用 4 次查表替代矩形像素求和的、AdaBoost 如何从 160,000 个候选特征中筛选出几千个、级联结构如何用前两层就干掉 80% 的背景窗口——那就需要沉到cascadedetect.cpp的 1764 行实现里去。
这篇文章从 API 表面开始,一层一层往下剥。先看detectMultiScale的调度逻辑,再进入多尺度检测的工程实现,然后深入 Haar 特征的积分图加速原理,接着拆解级联判决函数predictOrderedStump的源码逻辑,再横向展开到opencv_traincascade的 AdaBoost 训练循环,最后落地到一个安全帽检测器的完整训练流程。
读完之后你会拿到三样东西:Viola-Jones 框架的完整知识链路、OpenCV 检测与训练源码的核心代码地图、一套可直接复用的自定义级联分类器训练命令和调参策略。
第一层:detectMultiScale 的调用链
外观类与实现类的分离
用户看到的CascadeClassifier其实是一个外观类(Facade)。它持有一个Ptr<BaseCascadeClassi