OpenCV目标检测 级联分类器 C++实现
一.目标检测技术
目前常用实用性目标检测与跟踪的方法有以下两种:
帧差法
识别原理:基于前后两帧图像之间的差异进行对比,获取图像画面中正在运动的物体从而达到目标检测
缺点:画面中所有运动中物体都能识别
举个例子:我们的目标是识别运动的车辆,但是,在画面中镜头晃动,大风吹过树叶飘动也会被计算在甄别范围内,这就会导致甄别物出现错误
级联分类器
那么,有没有更好的方式能降低我们甄别目标出现错误的概率呢?
这边就可以使用我们的级联分类器了,如果我们的识别目标是车辆,那就需要把车辆相关的信息全部统计出来,比如:车辆颜色、车辆形状、车辆大小等信息,将他们存储在一个文件中,以提高甄别准确度,这个文件就是级联分类器
级联分类器也是机器视觉和机器学习中非常重要的一个环节
二.样本采集工作原理
使用基于Haar特征的级联分类器的对象检测,这是一种基于机器学习的方法,其中从许多正负图像中训练级联函数,然后,用于检测其他图像中的对象,在这里,我将进行人脸检测举例说明,最初,该算法需要大量正图像(面部图像)和负图像(无面部图像)来训练分类器, 然后,我们需要从中提取特征,为此,使用下图所示的Haar功能, 它们就像我们的卷积核一样,每个特征都是通过从黑色矩形下的像素总和中减去白色矩形下的像素总和而获得的单个值。
三.创建自己的级联分类器
1.准备好样本图像
正样本数据采集(我们需要检识别的目标图片,例如:车辆)
负样本数据采集(非检测物的图片)
2.环境配置(OpenCV win10)
下载OpenCV win10系统安装包
从安装包中的opencv\build\x64\vc15\bin 找到
- opencv_createsamples.exe
- opencv_traincascade.exe
- opencv_world342.dll
将以上文件拷贝到正负样本文件路径下

3.设置路径
创建正负样本的图像路径的 .txt文件


4.实现样本数据采集
调用opencv中opencv_createsamples.exe实现样本数据采集
通过命令行执行命令进行样本采集生成car_samples.vec正样本矢量集文件,命令行如下:
opencv_createsamples.exe -info car_list.txt -vec car_samples.vec -num 80 -w 33 -h 33
- info字段填写正样本描述文件
- vec用于保存制作的正样本
- num制定正样本的数目
- w和-h分别指定正样本的宽和高
在windows下终端运行,如下图所示:

5.实现样本数据训练
调用opencv中opencv_traincascade.exe对样本进行训练
通过命令行执行命令进行训练生成,命令行如下:
opencv_traincascade.exe -data data -vec car_samples.vec -bg ng_data.txt -numPos 80 -numNeg 240 -numStages 7 -w 33 -h 33 -minHitRate 0.995 -maxFalseAlarmRate 0.45 -mode ALL
-data:指定保存训练结果的文件夹
-vec:指定正样本集; -bg:指定负样本的描述文件夹
-numPos:指定每一级参与训练的正样本的数目(要小于正样本总数)
-numNeg:指定每一级参与训练的负样本的数目(可以大于负样本图片的总数)
-numStage:训练的级数
-w:正样本的宽
-h:正样本的高
-minHitRate:每一级需要达到的命中率(一般取值0.95-0.995)
-maxFalseAlarmRate:每一级所允许的最大误检率
-mode:使用Haar-like特征时使用,可选BASIC、CORE或者ALL
另外,还可指定以下字段:
-featureType:可选HAAR或LBP,默认为HAAR;
在windows下终端运行,进行训练,每一层训练都会有显示,如下图所示:

6.生成级联分类器文件
生成文件,如下所示:

四.代码实现
我们将继续编写代码通过C++ 编写 OpenCV 在Qt上来展现出我们的案例效果
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void datectCarDaw(Mat &frame,CascadeClassifier cascade,double scale)
{
//【灰度处理】
Mat gray;
cvtColor(frame,gray,CV_RGB2GRAY);
//一次还不够,级联分类器比帧差法还更加慢
//【二次压缩】因此,再将灰度图大小压缩一半左右
Mat smalling(cvRound(frame.rows/scale),cvRound(frame.cols/scale),CV_8UC1);
resize(gray,smalling,smalling.size(),0,0,INTER_LINEAR);
//【直方图均衡化】将缩小一半的灰度图进行均值化使其更加黑白分明
equalizeHist(smalling,smalling);
//imshow("smalling",smalling);
//调用级联分类器进行模型匹配并框出内容
vector<Rect>cars;
//【参数说明】 待检测的图片帧 被检测物体的矩形向量容器 每次搜索减小的图像比例 检测目标周围相邻矩形的最小个数(此处设为2个) 类型 目标区域的大小尺寸
cascade.detectMultiScale(smalling,cars,1.05,5,0|CV_HAAR_SCALE_IMAGE,Size(25,25));
vector<Rect>::const_iterator iter;
//【绘制标记框】注意,标记要画在原帧上,要讲方框的大小和帧坐标扩大,因为是根据灰度图识别的,灰度图被缩小了
for(iter=cars.begin();iter!=cars.end();iter++)
{
rectangle(frame,
cvPoint(cvRound(iter->x*scale),cvRound(iter->y*scale)),
cvPoint(cvRound((iter->x+iter->width)*scale),cvRound((iter->y+iter->height)*scale)),
Scalar(0,255,0),2,8
);
}
imshow("frame",frame);
}
int main(int argc, char *argv[])
{
//级联分类器(模型)
CascadeClassifier cascade;
cascade.load("C:/Users/86177/Desktop/cars-face/cars.xml");//读取级联分类器
Mat frame;
VideoCapture cap("C:/Users/86177/Desktop/image/test.mp4");//视频路径
while (cap.read(frame))
{
imshow("video",frame);//将读到的帧显示出来
datectCarDaw(frame,cascade,2);//将读到的帧传入函数用作识别
waitKey(5);//延时5ms
}
return 0;
}
为了方便对比,再次使用帧差法实现,可以看到移动的电动车都被识别进去了,如下图所示:
帧差法实现,如下图所示:

相关文章:
OpenCV目标检测 级联分类器 C++实现
一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种: 帧差法 识别原理:基于前后两帧图像之间的差异进行对比,获取图像画面中正在运动的物体从而达到目标检测 缺点:画面中所有运动中物体都能识别 举个例子…...
QT6 Socket通讯封装(TCP/UDP)
为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图,界面还没优化,后续更新 废话不多说直接上教程 添加库 如果为qmake项目中,在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…...
elasticsearch设置密码访问
1 用户认证介绍 默认ES是没有设置用户认证访问的,所以每次访问时,直接调相关API就能查询和写入数据。现在做一个认证,只有通过认证的用户才能访问和操作ES。 2 开启加密设置 1.生成证书文件 /usr/share/elasticsearch/bin/elasticsearch-…...
彻底理解如何优化接口性能
作为后端研发,必须要掌握怎么优化接口的性能或者说是响应时间,这样才能提高系统的系能,本文通过如下两个方面进行分析: 一.后端代码 有如下几步: 1.缓存机制 这是最场景的方式,当使用了缓存后,…...
C# 位运算
一、数据大小对应关系 说明: 将一个数据每左移一位,相当于乘以2。因此,左移8位就是乘以2的8次方,即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…...
【Flink-scala】DataStream编程模型之状态编程
DataStream编程模型之状态编程 参考: 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scal…...
RabbitMQ的核心组件有哪些?
大家好,我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些?】面试题。希望对大家有帮助; RabbitMQ的核心组件有哪些? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理(Messag…...
【Linux基础】基本开发工具的使用
目录 一、编译器——gcc/g的使用 gcc/g的安装 gcc的安装: g的安装: gcc/g的基本使用 gcc的使用 g的使用 动态链接与静态链接 程序的翻译过程 1. 一个C/C程序的构建过程,程序从源代码到可执行文件必须经历四个阶段 2. 理解选项的含…...
常见的数据结构和应用场景
数据结构是计算机科学中的基础概念,用于组织和存储数据,以便能够高效地访问和修改。下面是几种常见数据结构及其代表性应用场景: 1. 数组(Array) 问题解决:数组是一种线性数据结构,用于存储相…...
爬虫基础学习
爬虫概念与工作原理 爬虫是什么:爬虫(Web Scraping)是自动化地访问网站并提取数据的技术。它模拟用户浏览器的行为,通过HTTP请求访问网页,解析HTML文档并提取有用信息。 爬虫的基本工作流程: 发送HTTP请求…...
C++对象数组对象指针对象指针数组
一、对象数组 对象数组中的每一个元素都是同类的对象; 例1 对象数组成员的初始化 #include<iostream> using namespace std;class Student { public:Student( ){ };Student(int n,string nam,char s):num(n),name(nam),sex(s){};void display(){cout<&l…...
D96【python 接口自动化学习】- pytest进阶之fixture用法
day96 pytest的fixture详解(三) 学习日期:20241211 学习目标:pytest基础用法 -- pytest的fixture详解(三) 学习笔记: fixture(scop"class") (scop"class") 每一个类调…...
【算法】动态规划中01背包问题解析
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...
选择WordPress和Shopify:搭建对谷歌SEO友好的网站
在建设网站时,不仅要考虑它的美观和功能性,还要关注它是否对谷歌SEO友好。如果你希望网站能够获得更好的搜索排名,WordPress和Shopify是两个值得推荐的建站平台。 WordPress作为最流行的内容管理系统,其强大的灵活性和丰富的插件…...
代理IP与生成式AI:携手共创未来
目录 代理IP:网络世界的“隐形斗篷” 1. 隐藏真实IP,保护隐私 2. 突破网络限制,访问更多资源 生成式AI:创意与效率的“超级大脑” 1. 提高创作效率 2. 个性化定制 代理IP与生成式AI的协同作用 1. 网络安全 2. 内容创作与…...
iOS 应用的生命周期
Managing your app’s life cycle | Apple Developer Documentation Performance and metrics | Apple Developer Documentation iOS 应用的生命周期状态是理解应用如何在不同状态下运行和管理资源的基础。在 iOS 开发中,应用生命周期管理的是应用从启动到终止的整…...
Elasticsearch 集群快照的定期备份设置指南
Elasticsearch 集群快照的定期备份设置指南 概述 快照: 在给定时刻对整个集群或者单个索引进行备份,以便在之后出现故障时可以基于之前备份的快照进行快速恢复。 前提条件: 准备一个备份存储盘,本指南采用的是AWS EFS文件系统做…...
Docker--Docker Image(镜像)
什么是Docker Image? Docker镜像(Docker Image)是Docker容器技术的核心组件之一,它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说,Docker镜像是一个轻量级、可执行的软件包&…...
C++ 中的序列化和反序列化
一、C 中的序列化和反序列化 (一)基本概念 在 C 中,序列化是将对象转换为字节流的过程,反序列化则是从字节流重新构建对象的过程。这对于存储对象状态到文件、网络传输等场景非常有用。 (二)简单的序列化…...
我的Github学生认证申请过程
先说结论:很简单。 学生认证链接:GitHub Education GitHub 1. 首先你得绑定edu邮箱。这个应该没什么问题,Github也会提示。 2. 我是在学校里面、使用流量而非WiFi申请的,听说地理位置很重要,该给的权限(…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
