当前位置: 首页 > news >正文

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++实现

一.目标检测技术 目前常用实用性目标检测与跟踪的方法有以下两种&#xff1a; 帧差法 识别原理&#xff1a;基于前后两帧图像之间的差异进行对比&#xff0c;获取图像画面中正在运动的物体从而达到目标检测 缺点&#xff1a;画面中所有运动中物体都能识别 举个例子&#xf…...

QT6 Socket通讯封装(TCP/UDP)

为大家分享一下最近封装的以太网socket通讯接口 效果演示 如图&#xff0c;界面还没优化&#xff0c;后续更新 废话不多说直接上教程 添加库 如果为qmake项目中&#xff0c;在.pro文件添加 QT network QT core gui QT networkgreaterThan(QT_MAJOR_VERS…...

elasticsearch设置密码访问

1 用户认证介绍 默认ES是没有设置用户认证访问的&#xff0c;所以每次访问时&#xff0c;直接调相关API就能查询和写入数据。现在做一个认证&#xff0c;只有通过认证的用户才能访问和操作ES。 2 开启加密设置 1.生成证书文件 /usr/share/elasticsearch/bin/elasticsearch-…...

彻底理解如何优化接口性能

作为后端研发&#xff0c;必须要掌握怎么优化接口的性能或者说是响应时间&#xff0c;这样才能提高系统的系能&#xff0c;本文通过如下两个方面进行分析&#xff1a; 一.后端代码 有如下几步&#xff1a; 1.缓存机制 这是最场景的方式&#xff0c;当使用了缓存后&#xff0c;…...

C# 位运算

一、数据大小对应关系 说明&#xff1a; 将一个数据每左移一位&#xff0c;相当于乘以2。因此&#xff0c;左移8位就是乘以2的8次方&#xff0c;即256。 二、转换 1、 10进制转2进制字符串 #region 10进制转2进制字符串int number1 10;string binary Convert.ToString(num…...

【Flink-scala】DataStream编程模型之状态编程

DataStream编程模型之状态编程 参考&#xff1a; 1.【Flink-Scala】DataStream编程模型之数据源、数据转换、数据输出 2.【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 3.【Flink-scala】DataStream编程模型之窗口计算-触发器-驱逐器 4.【Flink-scal…...

RabbitMQ的核心组件有哪些?

大家好&#xff0c;我是锋哥。今天分享关于【RabbitMQ的核心组件有哪些&#xff1f;】面试题。希望对大家有帮助&#xff1b; RabbitMQ的核心组件有哪些&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RabbitMQ是一个开源的消息代理&#xff08;Messag…...

【Linux基础】基本开发工具的使用

目录 一、编译器——gcc/g的使用 gcc/g的安装 gcc的安装&#xff1a; g的安装&#xff1a; gcc/g的基本使用 gcc的使用 g的使用 动态链接与静态链接 程序的翻译过程 1. 一个C/C程序的构建过程&#xff0c;程序从源代码到可执行文件必须经历四个阶段 2. 理解选项的含…...

常见的数据结构和应用场景

数据结构是计算机科学中的基础概念&#xff0c;用于组织和存储数据&#xff0c;以便能够高效地访问和修改。下面是几种常见数据结构及其代表性应用场景&#xff1a; 1. 数组&#xff08;Array&#xff09; 问题解决&#xff1a;数组是一种线性数据结构&#xff0c;用于存储相…...

爬虫基础学习

爬虫概念与工作原理 爬虫是什么&#xff1a;爬虫&#xff08;Web Scraping&#xff09;是自动化地访问网站并提取数据的技术。它模拟用户浏览器的行为&#xff0c;通过HTTP请求访问网页&#xff0c;解析HTML文档并提取有用信息。 爬虫的基本工作流程&#xff1a; 发送HTTP请求…...

C++对象数组对象指针对象指针数组

一、对象数组 对象数组中的每一个元素都是同类的对象&#xff1b; 例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详解&#xff08;三&#xff09; 学习日期&#xff1a;20241211 学习目标&#xff1a;pytest基础用法 -- pytest的fixture详解&#xff08;三&#xff09; 学习笔记&#xff1a; fixture(scop"class") (scop"class") 每一个类调…...

【算法】动态规划中01背包问题解析

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

选择WordPress和Shopify:搭建对谷歌SEO友好的网站

在建设网站时&#xff0c;不仅要考虑它的美观和功能性&#xff0c;还要关注它是否对谷歌SEO友好。如果你希望网站能够获得更好的搜索排名&#xff0c;WordPress和Shopify是两个值得推荐的建站平台。 WordPress作为最流行的内容管理系统&#xff0c;其强大的灵活性和丰富的插件…...

代理IP与生成式AI:携手共创未来

目录 代理IP&#xff1a;网络世界的“隐形斗篷” 1. 隐藏真实IP&#xff0c;保护隐私 2. 突破网络限制&#xff0c;访问更多资源 生成式AI&#xff1a;创意与效率的“超级大脑” 1. 提高创作效率 2. 个性化定制 代理IP与生成式AI的协同作用 1. 网络安全 2. 内容创作与…...

iOS 应用的生命周期

Managing your app’s life cycle | Apple Developer Documentation Performance and metrics | Apple Developer Documentation iOS 应用的生命周期状态是理解应用如何在不同状态下运行和管理资源的基础。在 iOS 开发中&#xff0c;应用生命周期管理的是应用从启动到终止的整…...

Elasticsearch 集群快照的定期备份设置指南

Elasticsearch 集群快照的定期备份设置指南 概述 快照&#xff1a; 在给定时刻对整个集群或者单个索引进行备份&#xff0c;以便在之后出现故障时可以基于之前备份的快照进行快速恢复。 前提条件&#xff1a; 准备一个备份存储盘&#xff0c;本指南采用的是AWS EFS文件系统做…...

Docker--Docker Image(镜像)

什么是Docker Image&#xff1f; Docker镜像&#xff08;Docker Image&#xff09;是Docker容器技术的核心组件之一&#xff0c;它包含了运行应用程序所需的所有依赖、库、代码、运行时环境以及配置文件等。 简单来说&#xff0c;Docker镜像是一个轻量级、可执行的软件包&…...

C++ 中的序列化和反序列化

一、C 中的序列化和反序列化 &#xff08;一&#xff09;基本概念 在 C 中&#xff0c;序列化是将对象转换为字节流的过程&#xff0c;反序列化则是从字节流重新构建对象的过程。这对于存储对象状态到文件、网络传输等场景非常有用。 &#xff08;二&#xff09;简单的序列化…...

我的Github学生认证申请过程

先说结论&#xff1a;很简单。 学生认证链接&#xff1a;GitHub Education GitHub 1. 首先你得绑定edu邮箱。这个应该没什么问题&#xff0c;Github也会提示。 2. 我是在学校里面、使用流量而非WiFi申请的&#xff0c;听说地理位置很重要&#xff0c;该给的权限&#xff08…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...