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;

}

为了方便对比,再次使用帧差法实现,可以看到移动的电动车都被识别进去了,如下图所示:

帧差法实现,如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/63263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT从入门到精通(二) ——信号与槽机制

Qt 的信号与槽机制&#xff08;Signal and Slot&#xff09;是 Qt 框架 中用于对象间通信的核心机制之一。它允许对象之间进行松耦合的事件驱动式通信&#xff0c;尤其适合 GUI 应用程序 中的事件处理。 1. 基本概念 信号 (Signal) 当对象的状态发生变化时&#xff0c;它会发…

如何使用git新建本地仓库并关联远程仓库的步骤(详细易懂)

一、新建本地仓库并关联远程仓库的步骤 新建本地仓库 打开终端&#xff08;在 Windows 上是命令提示符或 PowerShell&#xff0c;在 Linux 和Mac上是终端应用&#xff09;&#xff0c;进入你想要创建仓库的目录。例如&#xff0c;如果你想在桌面上创建一个名为 “my - project”…

1Panel应用推荐:MaxKB开源知识库问答系统

1Panel&#xff08;github.com/1Panel-dev/1Panel&#xff09;是一款现代化、开源的Linux服务器运维管理面板&#xff0c;它致力于通过开源的方式&#xff0c;帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用&#xff0c;1Panel特别开通应用商店&am…

element plus的table组件,点击table的数据是,会出现一个黑色边框

在使用 Element Plus 的 Table 组件时&#xff0c;如果你点击表格数据后出现了一个黑色边框&#xff0c;这通常是因为浏览器默认的焦点样式&#xff08;outline&#xff09;被触发了。如图&#xff1a; 你可以通过自定义 CSS 来隐藏这个黑色边框&#xff0c;代码如下&#xff1…

泷羽sec学习打卡-brupsuite7搭建IP炮台

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-Brup-IP炮台搭建 搭建炮台服务端安装zmap1、更新系统和安装基础依赖&#xff…

赫布定律 | 机器学习 / 反向传播 / 经验 / 习惯

注&#xff1a;本文为 “赫布定律” 相关文章合辑。 未整理。 赫布定律 Hebb‘s law 馥墨轩 2021 年 03 月 13 日 00:03 1 赫布集合的基本定义 唐纳德・赫布&#xff08;Donald Hebb&#xff09;在 1949 年出版了《行为的组织》&#xff08;The Organization of Behavior&a…

各个数据库优劣势对比

1.关系型数据库&#xff08;RDBMS&#xff09; 优势&#xff1a; • 数据一致性&#xff1a;通过严格的事务处理和ACID&#xff08;原子性、一致性、隔离性、持久性&#xff09;特性&#xff0c;确保数据的一致性和完整性。 • 易于理解和使用&#xff1a;关系型数据库的表结构…

Excel中如何消除“长短款”

函数微调可以可以实施&#xff0c;简单且易于操作的气球&#x1f388;涨缩更妙。 (笔记模板由python脚本于2024年12月17日 06:19:13创建&#xff0c;本篇笔记适合用Excel操作数据的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Fre…

RJ45 网线线序、E1线线序、2B+d线序

1、RJ45 网线线序 线序排列如下&#xff1a; T568A线序&#xff1a;绿白—1&#xff0c;绿—2&#xff0c;橙白—3&#xff0c;蓝—4&#xff0c;蓝白—5&#xff0c; 橙—6&#xff0c;棕白—7&#xff0c;棕—8 T568B线序&#xff1a;橙白—1&#xff0c;橙—2&#xff0c…

Fortify_SCA_v24.2.0

前言 Fortify SCA 支持丰富的开发环境、语言、平台和框架&#xff0c;可对开发与生产混合环境进行安全检查。25 种编程语言 超过 911,000 个组件级 API 可检测超过 961 个漏洞类别 支持所有主流平台、构建环境和 IDE。 Fortify SCA是一款商业软件&#xff0c;价格较为昂贵&am…

rust的axux框架开启负载均衡和重启自身的方法-会议签到的调优

开启负载均衡和重启自身 更换axum后台的意外解决的尝试在caddy反代,使用负载均衡,加多一个节点axum主程序 ip映射信息做全局共享axum重启自身刷新全局共享配置 前期刚实现了rust的后台关键业务.结果出现了两类大问题停止服务.在正用着的时候,出现很多意外,真是刺激… 更换axum…

深入理解数据库索引:原理、分类与优化

目录 1. 索引基础1.1 索引的工作原理 2. 最左匹配原则2.1 什么是最左匹配原则&#xff1f;2.2 示例说明2.3 最左匹配原则的图示 3. 索引分类3.1 按数据结构分类3.2 按索引列数分类3.3 按唯一性分类3.4 按存储方式分类 4. 聚集索引与非聚集索引的区别4.1 聚集索引4.2 非聚集索引…

Three.js相机Camera控件知识梳理

原文&#xff1a;https://juejin.cn/post/7231089453695238204?searchId20241217193043D32C9115C2057FE3AD64 1. 相机类型 Three.js 主要提供了两种类型的相机&#xff1a;正交相机&#xff08;OrthographicCamera&#xff09;和透视相机&#xff08;PerspectiveCamera&…

一条线上的点

给你一个数组 points &#xff0c;其中 points[i] [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。 提示&#xff1a; 1 < points.length < 300points[i].length 2-104 < xi, yi < 104points 中的所有点 互不相同 解析&#xff1a;使用斜…

XX服务器上的npm不知道咋突然坏了

收到同事的V&#xff0c;说是&#xff1a;182上的npm不知道咋突然坏了&#xff0c;查到这里了&#xff0c;不敢动了。 咱一定要抓重点&#xff1a;突然坏了。这里的突然肯定不是瞬间&#xff08;大概率是上次可用&#xff0c;这次不可用&#xff0c;中间间隔了多长时间&#x…

HALCON 算子 之 形态学操作算子

文章目录 什么是形态学操作&#xff1f;为什么要形态学操作&#xff1f;怎么形态学操作&#xff1f;腐蚀 —— Erosionerosion1erosion_circle&#xff1a;erosion_rectangle1&#xff1a; 膨胀 —— Dilationdilation1dilation_circledilation_rectangle1 打开 —— Openingop…

pytest入门九:feature

fixture是pytest特有的功能&#xff0c;用以在测试执行前和执行后进行必要的准备和清理工作。使用pytest.fixture标识&#xff0c;定义在函数前面。在你编写测试函数的时候&#xff0c;你可以将此函数名称做为传入参数&#xff0c;pytest将会以依赖注入方式&#xff0c;将该函数…

秒优科技-供应链管理系统 login/doAction SQL注入漏洞复现

0x01 产品简介 秒优科技提供的供应链管理系统,即秒优SCM服装供应链管理系统,是一款专为服装电商企业设计的全方位解决方案。是集款式研发、订单管理、物料管理、生产管理、工艺管理、收发货管理、账单管理、报表管理于一体的服装电商供应链管理解决方案。它涵盖了从企划到开…

136.WEB渗透测试-信息收集-小程序、app(7)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;135.WEB渗透测试-信息收集-小程序、app&#xff08;6&#xff09; 进入之后我们通过输入…

K近邻原理和距离

K近邻 基本思想欧氏距离算法流程代码基于近邻用户的协同过滤基于近邻物品的协同过滤杰卡德相似度 基本思想 我们根据涂色样本点和未涂色样本点 X 的距离给涂色样本点编号1-6&#xff0c;即&#xff1a;1号样本点距离X最近&#xff0c;其余次之。 那么问题来了&#xff1a;样本…