OpenCV2D 特征框架 (19)目标检测类cv::CascadeClassifier的使用

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::CascadeClassifier 是 OpenCV 中用于对象检测的一个核心类,特别适用于基于 Haar 特征和 LBP(局部二进制模式)特征的目标检测任务。它实现了 Paul Viola 和 Michael Jones 提出的级联分类器算法,并由 Rainer Lienhart 等人进行了改进。

主要功能

  • 加载预训练模型:可以从文件中加载预训练的 Haar 或 LBP 分类器。
  • 对象检测:能够在给定图像中检测特定类型的目标(如人脸、行人等)。
  • 支持多种特征类型:包括 Haar-like 特征和 LBP 特征。

常用成员函数

  • 构造与析构
    CascadeClassifier(): 默认构造函数。
    ~CascadeClassifier(): 析构函数。
  • 加载分类器
    bool load(const String& filename): 从指定的 XML 或 YAML 文件加载分类器。这是使用预训练模型的第一步。
  • 对象检测
    void detectMultiScale(InputArray image, CV_OUT std::vector & objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size()): 在图像中检测目标对象。主要参数包括:
    • image: 输入图像。
    • objects: 检测到的对象列表,每个对象由一个矩形框表示。
    • scaleFactor: 比例因子,用于控制图像金字塔的比例变化。
    • minNeighbors: 每个候选矩形应保留的邻居数。该参数会影响结果的质量。
    • flags: 参数设置(现在通常不使用,默认为0)。
    • minSize: 目标对象的最小尺寸。
    • maxSize: 目标对象的最大尺寸。

其他实用方法

  • bool empty() const: 判断分类器是否为空。
  • void setImage(const Mat& img, int origWinWidth, int origWinHeight): 设置用于检测的图像及原始窗口大小。
  • double getFeatureType() const: 获取使用的特征类型(Haar 或 LBP)。
  • String getDefaultName() const: 返回对象的默认名称。

示例代码

下面是一个简单的例子,展示如何使用 CascadeClassifier 进行面部检测:

cpp 复制代码
#include <opencv2/objdetect.hpp>
#include <opencv2/opencv.hpp>

int main()
{
    // 创建 CascadeClassifier 对象
    cv::CascadeClassifier face_cascade;

    // 加载预训练的分类器
    if ( !face_cascade.load( "haarcascade_frontalface_default.xml" ) )
    {
        std::cerr << "Error loading face cascade\n";
        return -1;
    }

    // 读取输入图像
    cv::Mat img = cv::imread( "/media/dingxin/data/study/OpenCV/sources/images/zhou.png" );
    if ( img.empty() )
    {
        std::cerr << "Error loading image\n";
        return -1;
    }

    // 转换为灰度图
    cv::Mat gray;
    cvtColor( img, gray, cv::COLOR_BGR2GRAY );

    // 进行面部检测
    std::vector< cv::Rect > faces;
    face_cascade.detectMultiScale( gray, faces, 1.1, 3, 0, cv::Size( 30, 30 ) );

    // 绘制检测结果
    for ( size_t i = 0; i < faces.size(); i++ )
    {
        cv::rectangle( img, faces[ i ], cv::Scalar( 255, 0, 0 ), 2 );
    }

    // 显示结果
    cv::imshow( "Detected Faces", img );
    cv::waitKey();
    return 0;
}

运行结果

相关推荐
惊鸿一博1 分钟前
自动驾驶_一段式端到端_三条技术路线_UniAD_SparseDrive_概述
人工智能·机器学习·自动驾驶
byte轻骑兵2 分钟前
【LE Audio】BASS精讲[5]: 状态特征解析,广播接收状态实时可视全流程
人工智能·算法·音视频·语音识别·le audio·低功耗音频
IT_陈寒2 分钟前
Vite的HMR怎么突然失效了?原来是我太年轻
前端·人工智能·后端
Raink老师4 分钟前
【AI面试临阵磨枪-29】什么是 Function Calling?与手动解析 LLM 输出的区别?
人工智能·ai 面试
ai大模型中转api测评5 分钟前
构建生产级 AI 应用:GPT-5.5 与 Claude 4.7 的 Token 成本管理与工程化实战
大数据·人工智能·gpt·自动化
wxl7812277 分钟前
Hermes+Qwen3.6-35B本地离线全链路全自动开发React项目,完成cognee-ui从零开发+自动测试+自动修Bug闭环
人工智能·经验分享·自我提升·hermes agent
jkyy20147 分钟前
数智赋能药品零售:从卖药到健康服务,重构慢病管理新生态
人工智能·重构·健康医疗·零售
DO_Community9 分钟前
DigitalOcean 打造 AI 原生云,帮助 AI 应用大幅降低成本与运维复杂度
运维·人工智能·agent·claude
汽车仪器仪表相关领域10 分钟前
Kvaser Memorator R SemiPro:双通道CAN总线记录仪,汽车与工业测试的高性价比之选
大数据·网络·人工智能·功能测试·汽车·安全性测试
天天爱吃肉821811 分钟前
空间智能上车:新能源OEM决胜「第三空间」的底层技术革命|研发工程师深度解析
大数据·人工智能·嵌入式硬件·汽车