[22] Opencv_CUDA应用之 使用背景相减法进行对象跟踪

Opencv_CUDA应用之 使用背景相减法进行对象跟踪

  • 背景相减法是在一系列视频帧中将前景对象从背景中分离出来的过程,它广泛应用于对象检测和跟踪应用中去除背景

  • 背景相减法分四步进行:图像预处理 -> 背景建模 -> 检测前景 -> 数据验证

      1. 预处理去除噪声
      1. 背景建模,以便与前景分离
      1. 利用当前帧和背景之间的绝对差,将前景与模型背景相分离,将这个绝对差于设置的阈值相比较:如果大于阈值,则对象被认为是移动的,否则是静止的。

1. 高斯混合法

  • 高斯混合法(MoG) 是一种广泛使用的基于高斯混合的背景减法,用于分离前景和背景
  • 背景从帧序列中不断更新,混合K高斯分布用于将像素分类为前景或者背景,同时对帧的时间序列进行加权,以改善背景建模。
  • 连续变化的强度被归类为前景强度,静态强度被归类为背景强度
  • 实现代码如下:
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
#include<opencv2/cudabgsegm.hpp>using namespace std;
using namespace cv;
using namespace cv::cuda;
int main()
{VideoCapture cap("images/abc.avi");if (!cap.isOpened()){cerr << "can not open camera or video file" << endl;return -1;}Mat frame;cap.read(frame);GpuMat d_frame;d_frame.upload(frame);Ptr<BackgroundSubtractor> mog = cuda::createBackgroundSubtractorMOG();GpuMat d_fgmask, d_fgimage, d_bgimage;Mat h_fgmask, h_fgimage, h_bgimage;mog->apply(d_frame, d_fgmask, 0.01);while (1){cap.read(frame);if (frame.empty())break;d_frame.upload(frame);int64 start = cv::getTickCount();mog->apply(d_frame, d_fgmask, 0.01);mog->getBackgroundImage(d_bgimage);double fps = cv::getTickFrequency() / (cv::getTickCount() - start);std::cout << "FPS : " << fps << std::endl;d_fgimage.create(d_frame.size(), d_frame.type());d_fgimage.setTo(Scalar::all(0));d_frame.copyTo(d_fgimage, d_fgmask);d_fgmask.download(h_fgmask);d_fgimage.download(h_fgimage);d_bgimage.download(h_bgimage);cv::namedWindow("image", 0);cv::namedWindow("foreground mask", 0);cv::namedWindow("foreground image", 0);cv::namedWindow("mean background image", 0);imshow("image", frame);imshow("foreground mask", h_fgmask);imshow("foreground image", h_fgimage);imshow("mean background image", h_bgimage);cv::waitKey(0);if (waitKey(1) == 'q')break;}return 0;
}

在这里插入图片描述

2. GMG 背景相减法

  • GMG算法的名称源自该算法发明人的首字母,这个算法结合了背景估计与贝叶斯图像分割,使用贝叶斯推断将背景与前景分离,还使用帧的历史来建模
  • 它在此基于帧的时间序列进行加权,新的观测比旧的观测的权重还要高
  • 实现代码如下:
#include <iostream>
#include <string>
#include "opencv2/opencv.hpp"
#include "opencv2/cudabgsegm.hpp"
#include "opencv2/cudalegacy.hpp"using namespace std;
using namespace cv;
using namespace cv::cuda;int main(
)
{VideoCapture cap("images/abc.avi");if (!cap.isOpened()){cerr << "can not open video file" << endl;return -1;}Mat frame;cap.read(frame);GpuMat d_frame;d_frame.upload(frame);Ptr<BackgroundSubtractor> gmg = cuda::createBackgroundSubtractorGMG(40);GpuMat d_fgmask, d_fgimage, d_bgimage;Mat h_fgmask, h_fgimage, h_bgimage;gmg->apply(d_frame, d_fgmask);while (1){cap.read(frame);if (frame.empty())break;d_frame.upload(frame);int64 start = cv::getTickCount();gmg->apply(d_frame, d_fgmask, 0.01);double fps = cv::getTickFrequency() / (cv::getTickCount() - start);std::cout << "FPS : " << fps << std::endl;d_fgimage.create(d_frame.size(), d_frame.type());d_fgimage.setTo(Scalar::all(0));d_frame.copyTo(d_fgimage, d_fgmask);d_fgmask.download(h_fgmask);d_fgimage.download(h_fgimage);namedWindow("image", 0);namedWindow("foreground mask", 0);namedWindow("foreground image", 0);imshow("image", frame);imshow("foreground mask", h_fgmask);imshow("foreground image", h_fgimage);if (waitKey(30) == 'q')break;}return 0;
}

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

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

相关文章

博客搬家前台申请功能下线通知

尊敬的用户们&#xff1a; 您好&#xff01; 感谢您一直以来对我们博客平台的关注与支持。为了更好地优化我们的服务质量和用户体验&#xff0c;经过慎重考虑&#xff0c;我们决定将于近期对博客搬家前台申请功能进行下线处理。在此&#xff0c;我们向广大用户表示诚挚的歉意…

仿论坛项目--第一部分相关习题

1.关于IOC注解&#xff0c;说法正确的是 A.autowired用于注入bean,该注解只能写在成员变量的前面 B.Qualifier用于声明bean的名称&#xff0c;该注解只能引用bean的自定义名称 C.Bean用于装配第三方的Bean&#xff0c;不能装配自定义的bean D.Configuration用于声明配置类&…

AD9026芯片开发实录6-example code

官方发布的软件包中&#xff0c;带了一份example code&#xff0c;用于向客户展示API的调用方法以及基于官方的验证版ADRV902X最简单的bring up的流程。 该 example 位于软件包的路径下&#xff1a;“\Adi.Adrv9025.Api\src\c_src\app\example\”。 代码组成&#xff1a; initd…

JavaScript 实用技巧

1. 使用 const 和 let 替代 var 在 ES6 之前&#xff0c;我们通常使用 var 声明变量。但如今&#xff0c;推荐使用 const 和 let&#xff0c;因为它们具有块级作用域&#xff0c;可以避免很多潜在的问题。 const PI 3.14; // 常量&#xff0c;无法重新赋值 let age 25; // …

边界框在目标检测中的作用与应用

目标检测是计算机视觉领域的核心任务之一&#xff0c;旨在从图像或视频中识别和定位感兴趣的目标。边界框&#xff08;Bounding Box&#xff09;是目标检测中常用的一种表示方法&#xff0c;用于确定目标在图像中的确切位置。本文将详细探讨边界框的概念、它在目标检测中的角色…

使用ElementUI组件库

引入ElementUI组件库 1.安装插件 npm i element-ui -S 2.引入组件库 import ElementUI from element-ui; 3.引入全部样式 import element-ui/lib/theme-chalk/index.css; 4.使用 Vue.use(ElementUI); 5.在官网寻找所需样式 饿了么组件官网 我这里以button为例 6.在组件中使用…

Redis中设置验证码

限制一分钟内最多发送5次&#xff0c;且每次有效时间是5分钟&#xff01; String 发送验证码(phoneNumber) {key "shortMsg:limit:" phoneNumber;// 设置过期时间为 1 分钟&#xff08;60 秒&#xff09;// 使⽤ NX&#xff0c;只在不存在 key 时才能设置成功bool…

【QT】常用控件|widget|QPushButton|RadioButton|核心属性

目录 ​编辑 概念 信号与槽机制 控件的多样性和定制性 核心属性 enabled geometry ​编辑 windowTiltle windowIcon toolTip styleSheet PushButton RadioButton 概念 QT 控件是构成图形用户界面&#xff08;GUI&#xff09;的基础组件&#xff0c;它们是实现与…

tensorflow和numpy的版本

查看cuda版本 dpkg -l | grep cuda i libcudart11.0:amd64 11.5.117~11.5.1-1ubuntu1 amd64 NVIDIA CUDA Runtime Library ii nvidia-cuda-dev:amd64 11.5.1-1ubuntu1 …

搜维尔科技:数据手套为什么要选择SenseGlove

了解 SenseGlove SenseGlove 是一支由电子工程师、触觉研究人员和计算机视觉专家、XR 开发人员、UX 设计师和产品创新者组成的科幻爱好者团队&#xff0c;他们拥有丰富人类能力和赋予 Metaverse 意义的技能和热情。 推进触觉技术是我们实现这一目标的方式。 公司及产品背景 S…

【C++知识点总结全系列 (02)】:C++中的语句、运算符和表达式详细总结

文章目录 1、语句(1)简单语句A.空语句B.复合语句 (2)条件语句(3)迭代语句A.常规for循环B.范围for循环C.while和do...while (4)跳转语句A.break语句B.continue语句C.goto语句 (5)异常处理语句A.标准异常B.throw抛出异常 (6)try语句 2、运算符(1)算术运算符(2)关系运算符(3)逻辑运…

Cybervadis认证是什么?

Cybervadis认证是一种全面且深入的网络安全评估和认证服务&#xff0c;旨在帮助组织提高其网络安全实践的成熟度&#xff0c;并有效应对不断变化的网络威胁和攻击。以下是关于Cybervadis认证的一些关键信息&#xff1a; 认证目的&#xff1a; 评估和验证组织在网络安全方面的能…

Andrej Karpathy提出未来计算机2.0构想: 完全由神经网络驱动!网友炸锅了

昨天凌晨&#xff0c;知名人工智能专家、OpenAI的联合创始人Andrej Karpathy提出了一个革命性的未来计算机的构想&#xff1a;完全由神经网络驱动的计算机&#xff0c;不再依赖传统的软件代码。 嗯&#xff0c;这是什么意思&#xff1f;全部原生LLM硬件设备的意思吗&#xff1f…

HarmonyOS开发实战:UDP通讯示例规范

1. UDP简介 UDP协议是传输层协议的一种&#xff0c;它不需要建立连接&#xff0c;是不可靠、无序的&#xff0c;相对于TCP协议报文更简单&#xff0c;在特定场景下有更高的数据传输效率&#xff0c;在现代的网络通讯中有广泛的应用&#xff0c;以最新的HTTP/3为例&#xff0c;…

ESP32-Web-Server编程-建立多个 web server

ESP32-Web-Server编程-建立多个 web server 概述 当一个 web server 处理的请求过多、或者有长时间占用此 web server 的使用场景时,一个 web server 就不够用了。 这种情况下,我们可以在一个设备上建立两个或多个 web server 来满足更复杂的需求。 单个设备上建立多个 w…

Redis如何实现主从复制

Redis主从复制包括全量复制和增量复制。主是主服务器&#xff0c;从是从服务器&#xff0c;主服务器(master &#xff09;的数据如果更新了也会同步到从服务器(slave)&#xff0c;一个主服务器可以搭配很多个从服务器&#xff0c;主服务器负责写入&#xff0c;从服务器只能读取…

vmware虚拟机安装openEuler

一、openEuler简介 openEuler是一款开源操作系统。当前openEuler内核源于Linux&#xff0c;支持鲲鹏及其它多种处理器&#xff0c;能够充分释放计算芯片的潜能&#xff0c;是由全球开源贡献者构建的高效、稳定、安全的开源操作系统&#xff0c;适用于数据库、大数据、云计算、…

EEPROM内部原理

A2, A1, A0是EEPROM的地址引脚&#xff0c;用于设置设备地址。它们的作用如下&#xff1a; 设备寻址&#xff1a; 这三个引脚允许在I2C总线上唯一地标识EEPROM芯片。通过不同的连接方式&#xff08;接高、接低或悬空&#xff09;&#xff0c;可以为同一类型的EEPROM芯片设置不同…

1uH电感SK6615电流1.5A频率2MHz输入5.5V同步降压转换器

SK6615C 1.5A 2MHz 5.5V同步降压转换器 SK6615 SOT23-5封装和丝印LA 描述 该SK6615C是一款高效、DC-DC降压型开关稳压器&#xff0c;能够提供高达1.5A的输出电流。该器件的工作输入电压范围为 2.6V 至 5.5V&#xff0c;输出电压范围为 0.6V 至 VIN。工作频率为2MHz&#xff0c…

02.C1W1.Sentiment Analysis with Logistic Regression

目录 Supervised ML and Sentiment AnalysisSupervised ML (training)Sentiment analysis Vocabulary and Feature ExtractionVocabularyFeature extractionSparse representations and some of their issues Negative and Positive FrequenciesFeature extraction with freque…