背景减除(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

相关文章

C#中checked关键字的使用小结

《C#中checked关键字的使用小结》本文主要介绍了C#中checked关键字的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录✅ 为什么需要checked? 问题:整数溢出是“静默China编程”的(默认)checked的三种用

C#中预处理器指令的使用小结

《C#中预处理器指令的使用小结》本文主要介绍了C#中预处理器指令的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录 第 1 名:#if/#else/#elif/#endif✅用途:条件编译(绝对最常用!) 典型场景: 示例

Mysql中RelayLog中继日志的使用

《Mysql中RelayLog中继日志的使用》MySQLRelayLog中继日志是主从复制架构中的核心组件,负责将从主库获取的Binlog事件暂存并应用到从库,本文就来详细的介绍一下RelayLog中... 目录一、什么是 Relay Log(中继日志)二、Relay Log 的工作流程三、Relay Lo

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

springboot3.x使用@NacosValue无法获取配置信息的解决过程

《springboot3.x使用@NacosValue无法获取配置信息的解决过程》在SpringBoot3.x中升级Nacos依赖后,使用@NacosValue无法动态获取配置,通过引入SpringC... 目录一、python问题描述二、解决方案总结一、问题描述springboot从2android.x

SpringBoot整合AOP及使用案例实战

《SpringBoot整合AOP及使用案例实战》本文详细介绍了SpringAOP中的切入点表达式,重点讲解了execution表达式的语法和用法,通过案例实战,展示了AOP的基本使用、结合自定义注解以... 目录一、 引入依赖二、切入点表达式详解三、案例实战1. AOP基本使用2. AOP结合自定义注解3.

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

使用Python将PDF表格自动提取并写入Word文档表格

《使用Python将PDF表格自动提取并写入Word文档表格》在实际办公与数据处理场景中,PDF文件里的表格往往无法直接复制到Word中,本文将介绍如何使用Python从PDF文件中提取表格数据,并将... 目录引言1. 加载 PDF 文件并准备 Word 文档2. 提取 PDF 表格并创建 Word 表格

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA