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

news/2024/7/21 4:10:03 标签: c++, 图像处理

入侵监控领域中,在固定场景下,需要检测和监控的入侵物体种类繁多,无法具体穷尽。传统的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-frame
        capture >> img_input;

        if (img_input.empty()) break;

        // Resize input frame for better visualization
        cv::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----------------------------------------------------- 


http://www.niftyadmin.cn/n/5450179.html

相关文章

网络电视盒子哪个品牌好?2024畅销电视盒子排行榜

电视盒子的品牌和产品非常多&#xff0c;让新手在选购时难度增大&#xff0c;大部分消费者在此时会选择参考销量排名情况&#xff0c;小编这次结合各个电商平台的销量和用户评价整理了电视盒子排行榜&#xff0c;想买电视盒子不知道网络电视盒子哪个品牌好可以收藏。 TOP 1.泰捷…

深度学习损失函数新成果!18个突破性方法,让模型更精准、更高效

基于最优传输思想设计的分类损失函数EMO解决了交叉熵损失函数在某些场景暴露的一些问题&#xff0c;如偏离评价指标、过度自信等&#xff0c;它源于交叉熵损失函数&#xff0c;能大幅提高 LLM 的微调效果。 交叉熵损失函数是最常用的一种损失函数。在机器学习中&#xff0c;损…

Git 的数据安全性问题

Git 本身是一个版本控制系统&#xff0c;它不会自动将你的源代码传送到你不了解的地址。Git 的工作原理是在本地存储仓库的完整副本&#xff0c;并且所有的版本控制操作&#xff08;如提交、分支、合并等&#xff09;都首先在本地进行。当你想要与远程仓库同步时&#xff0c;你…

YOLOv9改进策略:IoU优化 | Powerful-IoU更好、更快的收敛IoU,效果秒杀CIoU、GIoU等 | 2024年最新IoU

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文独家改进&#xff1a;Powerful-IoU更好、更快的收敛IoU&#xff0c;是一种结合了目标尺寸自适应惩罚因子和基于锚框质量的梯度调节函数的损失函数 &#x1f4a1;&#x1f4a1;&#x1f4a1;MS COCO和PASCAL VOC数据集实现涨点 YO…

#Linux(编写第一个命令)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;编写一个c程序然后将生成的可执行的文件加入环境变量或者放入bin目录中&#xff0c;即可在其他目录下调用&#xff08;之前编写的程序只能在…

element-ui实现各种证件照上传预览下载组件封装,图片上传回显及长宽自定义功能单个图片上传功能附带源码

element-ui实现证件照上传预览下载组件封装 效果&#xff1a; 参数说明 我只写了两个参数&#xff0c;后续有需求再对其组件进行丰富~ 参数说明fileListProp用来存储上传后后端返回的图片UR了uploadUrl图片上传返回的URL后端接口地址widthProp图片上传框的宽度heightProp图片…

学习vue3第十一节(依赖注入:provide/inject)

本机介绍&#xff1a;provide/inject 注意&#xff1a;大家在看此小节时候&#xff0c;默认大家已经了解一些组件的使用方法 1、依赖注入的用途&#xff1a; 当嵌套层级多的时候&#xff0c;某个子组件需要较远层级的父组件数据时候&#xff0c;如果我们依然使用props 传递数…

Vue【七】实现图片上传与预览

前端 图片上传 <template><div class"comment-wrapper"><el-form :model"form" style" padding: 20px;" label-width"80px"><el-form-item label"评价内容"><el-input v-model"form.c…