bgslibrary视频前景提取算法之帧差法

2024-03-10 09:58

本文主要是介绍bgslibrary视频前景提取算法之帧差法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

BGSLibrary:A Background Subtraction Library
The BGSLibrary was developed by Andrews Sobral and provides an easy-to-use C++ framework based on OpenCV to perform background subtraction (BGS) in videos.
github介绍及下载地址 : https://github.com/andrewssobral/bgslibrary
现有30+种视频前景提取算法,不一定最优,但可以比较效果,准备研究其中部分。

第一次写,给出完整的头文件和main函数,以后仅给出要实现的算法
这次先实现 帧差法 (FrameDifferenceBGS) FrameDifference,总共4个文件
IBGS.h //IBGS是所有不同的视频前景提取算法的抽象类 ,我去掉其中saveConfig()和loadConfig()
FrameDifferenceBGS.h 帧差法
FrameDifferenceBGS.cpp
main.cpp //自己写的调用

文件名: IBGS.h

/*
This file is part of BGSLibrary.BGSLibrary is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.BGSLibrary is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.You should have received a copy of the GNU General Public License
along with BGSLibrary.  If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/highgui/highgui_c.h>class IBGS
{
public:virtual void process(const cv::Mat &img_input, cv::Mat &img_foreground, cv::Mat &img_background) = 0;/*virtual void process(const cv::Mat &img_input, cv::Mat &img_foreground){process(img_input, img_foreground, cv::Mat());}*/virtual ~IBGS(){}private:/*virtual void saveConfig() = 0;virtual void loadConfig() = 0;*/
};

参考demo后自己写的main函数
main.cpp

#include <iostream>
#include "FrameDifferenceBGS.h"
#include "IBGS.h"
using namespace cv;
using namespace std;#define resizedHeight       480     
#define resizedWidth        600     
#define VIDEOFILE    "1.mp4"
#define frameTostart 20      //设置开始帧string inputPath = "E:\\2paperCode\\testVideo\\Crossroad\\229\\";
int main(int argc, char* argv[])
{VideoCapture capture(inputPath + VIDEOFILE);if (!capture.isOpened()){cerr << "No video input\n" << endl;return -1;}   IBGS *bgsFDiff;bgsFDiff = new FrameDifferenceBGS();//使用帧差法int pause = 0;Mat img_input;Mat img_input_resized(resizedHeight, resizedWidth, CV_8UC3);capture.set(CAP_PROP_POS_FRAMES, frameTostart); FrameDifferenceBGS fdiff;while (!pause){capture >> img_input;if (img_input.empty())break;resize(img_input, img_input_resized, img_input_resized.size());namedWindow("input", WINDOW_NORMAL);imshow("input", img_input_resized);Mat img_mask;Mat img_bkgmodel;bgsFDiff->process(img_input, img_mask, img_bkgmodel); // by default, it shows automatically the foreground mask imageif (cvWaitKey(10) == 'q')pause = !pause;}delete bgsFDiff;cvDestroyAllWindows();capture.release();return 0;
}

帧差法头文件,从 IBGS继承而来
FrameDifferenceBGS.h

#pragma once#include <iostream>
#include <opencv2/opencv.hpp>#include "IBGS.h"class FrameDifferenceBGS : public IBGS
{
private:bool firstTime;cv::Mat img_input_prev;cv::Mat img_foreground;bool enableThreshold;int threshold;bool showOutput;public:FrameDifferenceBGS();~FrameDifferenceBGS();void process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel);//private:
//  void saveConfig();
//  void loadConfig();
};

FrameDifferenceBGS.cpp

#include "FrameDifferenceBGS.h"FrameDifferenceBGS::FrameDifferenceBGS() : firstTime(true), enableThreshold(true), threshold(15), showOutput(true)
{std::cout << "FrameDifferenceBGS()" << std::endl;
}FrameDifferenceBGS::~FrameDifferenceBGS()
{std::cout << "~FrameDifferenceBGS()" << std::endl;
}void FrameDifferenceBGS::process(const cv::Mat &img_input, cv::Mat &img_output, cv::Mat &img_bgmodel)
{if (img_input.empty())return;enableThreshold = true;threshold = 15;showOutput = true;if (img_input_prev.empty()){img_input.copyTo(img_input_prev);//前一帧为空时,将当前帧复制给前一帧return;}cv::absdiff(img_input_prev, img_input, img_foreground);if (img_foreground.channels() == 3)cv::cvtColor(img_foreground, img_foreground, CV_BGR2GRAY);if (enableThreshold)cv::threshold(img_foreground, img_foreground, threshold, 255, cv::THRESH_BINARY);if (showOutput){namedWindow("Frame Difference", cv::WINDOW_NORMAL);cv::imshow("Frame Difference", img_foreground);}img_foreground.copyTo(img_output);img_input.copyTo(img_input_prev);firstTime = false;
}

PS:尽量使用 OpenCV 内置函数. 调用LUT 函数可以获得最快的速度. 这是因为OpenCV库可以通过英特尔线程架构启用多线程,下面的opencv矩阵操作均是优化的多线程并行处理,较高效
具体参考:快速对图像的像素进行操作 opencv 实战

这篇关于bgslibrary视频前景提取算法之帧差法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

SpringBoot实现MD5加盐算法的示例代码

《SpringBoot实现MD5加盐算法的示例代码》加盐算法是一种用于增强密码安全性的技术,本文主要介绍了SpringBoot实现MD5加盐算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习... 目录一、什么是加盐算法二、如何实现加盐算法2.1 加盐算法代码实现2.2 注册页面中进行密码加盐2.

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

基于Python开发批量提取Excel图片的小工具

《基于Python开发批量提取Excel图片的小工具》这篇文章主要为大家详细介绍了如何使用Python中的openpyxl库开发一个小工具,可以实现批量提取Excel图片,有需要的小伙伴可以参考一下... 目前有一个需求,就是批量读取当前目录下所有文件夹里的Excel文件,去获取出Excel文件中的图片,并

详解如何使用Python提取视频文件中的音频

《详解如何使用Python提取视频文件中的音频》在多媒体处理中,有时我们需要从视频文件中提取音频,本文为大家整理了几种使用Python编程语言提取视频文件中的音频的方法,大家可以根据需要进行选择... 目录引言代码部分方法扩展引言在多媒体处理中,有时我们需要从视频文件中提取音频,以便进一步处理或分析。本文

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

基于Python实现一个PDF特殊字体提取工具

《基于Python实现一个PDF特殊字体提取工具》在PDF文档处理场景中,我们常常需要针对特定格式的文本内容进行提取分析,本文介绍的PDF特殊字体提取器是一款基于Python开发的桌面应用程序感兴趣的... 目录一、应用背景与功能概述二、技术架构与核心组件2.1 技术选型2.2 系统架构三、核心功能实现解析

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

Linux使用cut进行文本提取的操作方法

《Linux使用cut进行文本提取的操作方法》Linux中的cut命令是一个命令行实用程序,用于从文件或标准输入中提取文本行的部分,本文给大家介绍了Linux使用cut进行文本提取的操作方法,文中有详... 目录简介基础语法常用选项范围选择示例用法-f:字段选择-d:分隔符-c:字符选择-b:字节选择--c