背景减除(1)--bgslibrary Windows编译和使用

2024-03-25 23:52

本文主要是介绍背景减除(1)--bgslibrary Windows编译和使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

入侵监控领域中,在固定场景下,需要检测和监控的入侵物体种类繁多,无法具体穷尽。传统的CV算法提取的特征应用场景有限,无法完成大量物体的监控;深度学习目标检测方法没法收集到无穷无尽的物体种类,因此监督效果仅限于编著物体,且适应性因场景变化而变化;异常检测方案,因为场景随着天气、光照的变化,无法行之有效的判断出异常物体的位置,并有时甚至出现误判断。

背景减除算法,通过学习固定场景下不变的背景,利用当前帧的的数据与背景的差分,可以很容易得到前景,在无需分类的场景下得到广泛应用。

这里推荐一个宝藏github主的分享,对于学习背景建模相关的东西很有帮助。https://github.com/murari023/awesome-background-subtraction/blob/master/README.md#projects

GitHub - andrewssobral/bgslibrary: A C++ Background Subtraction Library with wrappers for Python, MATLAB, Java and GUI on QT

一、bgslibrary库的下载

使用背景建模基本都会使用到两个库,一个是opencv里面关于background subtraction相关的库,另一个就是bgslibrary,其链接地址如下: 

https://github.com/andrewssobral/bgslibrary 

该库是由Andrews Sobral 于2012年开始编写的,主要使用C++语言,结合opencv进行编写完成,当前还适配python、java、matlab等语言。最新release的算法版本总计实现了43个算法,针对不同版本的opencv,所能适配的和使用的背景建模算法均不一致,下图为部分示例。

 可以通过上述github链接直接下载bgslibrary,然后解压到自己的盘符中存放

二、bgslibrary库的编译

编译的具体步骤可以参考如下链接:https://github.com/andrewssobral/bgslibrary/wiki/Installation-instructions---Windows

首先打开cmd,确认电脑已经安装cmake相关的软件。

解压已经下载到本地的bgslibrary库,然后cd进入bgslibrary

 进入C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build,并点击运行vcvars64.bat文件,需要管理员权限才能正常运行

 设置opencv库的安装目录:

切换到编译目录bgslibrary/build下;

调用cmake命令进行安装编译,编译命令如下所示:

cmake -DOpenCV_DIR="D:\personal\personal\opencv\build" -G "Visual Studio 16 2019" ..

配置成功出现如下所示显示结果。

最后使用visual studio 2019 打开稀土中的sln文件,选择你需要的编译库的类型(例如X64+debug或者X64+release),直接点击build编译即可。编译完成后可以在build文件夹中生成bgslibrary_core.lib以及bgslibrary_core.dll文件。

三、bgslibrary库的使用

首先,新建一个工程,取一个工程名称,将bgslibrary库下面的src文件夹拷贝到本工程目录下,将编译生成的lib以及dll拷贝到本工程下的lib文件以及工程下,具体如下图所示。

接着,在包含目录中配置opencv和bgs库的头文件目录,库目录中包含opencv和bgs库的库目录所在位置,如下所示:

在链接器中增加opencv_world470d.lib以及bgslibrary_core.lib

新建一个main.cpp,加入如下代码:

 

#include <iostream>
#include <algorithm>
#include <iterator>
#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include"../src/algorithms/algorithms.h"auto algorithmsName = BGS_Factory::Instance()->GetRegisteredAlgorithmsName();int main() {std::cout << "Using OpenCV " << CV_MAJOR_VERSION << "." << CV_MINOR_VERSION << "." << CV_SUBMINOR_VERSION << std::endl;std::cout << "Number of available algorithms: " << algorithmsName.size() << std::endl;std::cout << "List of available algorithms:" << std::endl;std::copy(algorithmsName.begin(), algorithmsName.end(), std::ostream_iterator<std::string>(std::cout, "\n"));/*List of all algorithms:(Note that some of these algorithms are available only for a specific version of OpenCV, see algorithms.h)AdaptiveBackgroundLearning,AdaptiveSelectiveBackgroundLearning,CodeBook,DPAdaptiveMedian,DPEigenbackground,DPGrimsonGMM,DPMean,DPPratiMediod,DPTexture,DPWrenGA,DPZivkovicAGMM,FrameDifference,FuzzyChoquetIntegral,FuzzySugenoIntegral,GMG,IndependentMultimodal,KDE,KNN,LBAdaptiveSOM,LBFuzzyAdaptiveSOM,LBFuzzyGaussian,LBMixtureOfGaussians,LBP_MRF,LBSimpleGaussian,LOBSTER,MixtureOfGaussianV2,MixtureOfGaussianV1,MultiCue,MultiLayer,PAWCS,PixelBasedAdaptiveSegmenter,SigmaDelta,StaticFrameDifference,SuBSENSE,T2FGMM_UM,T2FGMM_UV,T2FMRF_UM,T2FMRF_UV,TwoPoints,ViBe,VuMeter,WeightedMovingMean,WeightedMovingVariance*/std::string algorithmName = "KNN";//int cameraIndex = 0;//if (argc > 1) algorithmName = argv[1];//if (argc > 2) cameraIndex = std::stoi(argv[2]);std::string video_path = "./00010000684000000_4.mp4";cv::VideoCapture capture;capture.open(video_path);if (!capture.isOpened()) {std::cerr << "Cannot initialize web camera!" << std::endl;return -1;}std::cout << "Running " << algorithmName << std::endl;auto bgs = BGS_Factory::Instance()->Create(algorithmName);cv::Mat img_input;auto key = 0;std::cout << "Press 's' to stop:" << std::endl;while (key != 's') {// Capture frame-by-framecapture >> img_input;if (img_input.empty()) break;// Resize input frame for better visualizationcv::resize(img_input, img_input, cv::Size(380, 240), 0, 0, CV_INTER_LINEAR);cv::imshow("input", img_input);cv::Mat img_mask;cv::Mat img_bkgmodel;try {// by default, bgs->process(...) shows automatically the foreground mask image// or you can disable it by: bgs->setShowOutput(false);bgs->process(img_input, img_mask, img_bkgmodel);if(!img_mask.empty())cv::imshow("Foreground", img_mask);//  ....do something else...}catch (std::exception& e) {std::cout << "Exception occurred" << std::endl;std::cout << e.what() << std::endl;}key = cv::waitKey(33);}cv::destroyAllWindows();capture.release();return 0;}

运行本程序,可以看到结果如下所示:

---------------------------------------------------END----------------------------------------------------- 

这篇关于背景减除(1)--bgslibrary Windows编译和使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/846669

相关文章

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

Java使用正则提取字符串中的内容的详细步骤

《Java使用正则提取字符串中的内容的详细步骤》:本文主要介绍Java中使用正则表达式提取字符串内容的方法,通过Pattern和Matcher类实现,涵盖编译正则、查找匹配、分组捕获、数字与邮箱提... 目录1. 基础流程2. 关键方法说明3. 常见场景示例场景1:提取所有数字场景2:提取邮箱地址4. 高级

使用SpringBoot+InfluxDB实现高效数据存储与查询

《使用SpringBoot+InfluxDB实现高效数据存储与查询》InfluxDB是一个开源的时间序列数据库,特别适合处理带有时间戳的监控数据、指标数据等,下面详细介绍如何在SpringBoot项目... 目录1、项目介绍2、 InfluxDB 介绍3、Spring Boot 配置 InfluxDB4、I

使用Java读取本地文件并转换为MultipartFile对象的方法

《使用Java读取本地文件并转换为MultipartFile对象的方法》在许多JavaWeb应用中,我们经常会遇到将本地文件上传至服务器或其他系统的需求,在这种场景下,MultipartFile对象非... 目录1. 基本需求2. 自定义 MultipartFile 类3. 实现代码4. 代码解析5. 自定

使用Python实现无损放大图片功能

《使用Python实现无损放大图片功能》本文介绍了如何使用Python的Pillow库进行无损图片放大,区分了JPEG和PNG格式在放大过程中的特点,并给出了示例代码,JPEG格式可能受压缩影响,需先... 目录一、什么是无损放大?二、实现方法步骤1:读取图片步骤2:无损放大图片步骤3:保存图片三、示php

使用Python实现一个简易计算器的新手指南

《使用Python实现一个简易计算器的新手指南》计算器是编程入门的经典项目,它涵盖了变量、输入输出、条件判断等核心编程概念,通过这个小项目,可以快速掌握Python的基础语法,并为后续更复杂的项目打下... 目录准备工作基础概念解析分步实现计算器第一步:获取用户输入第二步:实现基本运算第三步:显示计算结果进

python之uv使用详解

《python之uv使用详解》文章介绍uv在Ubuntu上用于Python项目管理,涵盖安装、初始化、依赖管理、运行调试及Docker应用,强调CI中使用--locked确保依赖一致性... 目录安装与更新standalonepip 安装创建php以及初始化项目依赖管理uv run直接在命令行运行pytho

C#使用Spire.XLS快速生成多表格Excel文件

《C#使用Spire.XLS快速生成多表格Excel文件》在日常开发中,我们经常需要将业务数据导出为结构清晰的Excel文件,本文将手把手教你使用Spire.XLS这个强大的.NET组件,只需几行C#... 目录一、Spire.XLS核心优势清单1.1 性能碾压:从3秒到0.5秒的质变1.2 批量操作的优雅