背景减除法(Background subtraction)常用于通过静态摄像头生成一个前景掩码,即场景中移动物体的二进制图像。


代码示例

#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/videoio.hpp"
#include "opencv2/video.hpp"#include <iostream>
#include <sstream>using namespace std;
using namespace cv;Mat frame;                              // 当前帧
Mat fgMaskMOG2;                         // 前景模板,通过MOG2方法生成
Ptr<BackgroundSubtractor> pMOG2;        // MOG2 背景消除
char keyboard;                          // 按键响应
const char* filename;void processVideo(const char* videoFilename);
void processImages(const char* firstFrameFilename);int main()
{pMOG2 = createBackgroundSubtractorMOG2();                      // MOG2方法,背景消除char video_or_image;string s;cout << "Pless choose Video or Image: ( V / I )\t";cin >> video_or_image ;if (video_or_image == 'V' || video_or_image == 'v')             // 视频{cout << "\n\nPlease input the address of the video:\t";cin >> s;filename = s.c_str();namedWindow("Frame");namedWindow("FG Mask MOG2");processVideo(filename);}else if (video_or_image == 'I' || video_or_image == 'i')        // 图像{cout << "\n\nPlease input the address of the images:\t";cin >> s;filename = s.c_str();namedWindow("Frame");namedWindow("FG Mask MOG2");processImages(filename);}else{cerr << "Wrong Input !" << endl;return EXIT_FAILURE;}destroyAllWindows();return EXIT_SUCCESS;
}void processVideo(const char* videoFilename)
{VideoCapture capture(videoFilename);                            // 捕获视频if (!capture.isOpened()) { exit(EXIT_FAILURE); }keyboard = 0;while (keyboard != 'q'&&keyboard != 27){if (!capture.read(frame)) { exit(EXIT_FAILURE); }           // 读取当前帧pMOG2->apply(frame, fgMaskMOG2);                            // 获取前景掩模stringstream ss;ss << capture.get(CAP_PROP_POS_FRAMES);                     // 获取当前帧数string frameNumberString = ss.str();rectangle(frame, cv::Point(10, 2), cv::Point(100, 20), cv::Scalar(255, 255, 255), -1);putText(frame, frameNumberString.c_str(), cv::Point(15, 15),FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));imshow("Frame", frame);imshow("FG Mask MOG2", fgMaskMOG2);keyboard = (char)waitKey(30);}capture.release();
}void processImages(const char* fistFrameFilename)
{frame = imread(fistFrameFilename);if (frame.empty()) { exit(EXIT_FAILURE); }string fn(fistFrameFilename);keyboard = 0;while (keyboard != 'q' && keyboard != 27) {pMOG2->apply(frame, fgMaskMOG2);                    // 获取前景掩模size_t index = fn.find_last_of("/");if (index == string::npos)                          // 如果'/'不存在则搜寻'\\'index = fn.find_last_of("\\");size_t index2 = fn.find_last_of(".");string prefix = fn.substr(0, index + 1);            // 图像路径前部分,前为起始位置,后为长度string suffix = fn.substr(index2);                  // 图像路径后部分,图像格式string frameNumberString = fn.substr(index + 1, index2 - index - 1);istringstream iss(frameNumberString);int frameNumber = 0;iss >> frameNumber;rectangle(frame, cv::Point(10, 2), cv::Point(100, 20),cv::Scalar(255, 255, 255), -1);putText(frame, frameNumberString.c_str(), cv::Point(15, 15),FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 0, 0));imshow("Frame", frame);imshow("FG Mask MOG 2", fgMaskMOG2);keyboard = (char)waitKey(30);ostringstream oss;oss << (frameNumber + 1);string nextFrameNumberString = oss.str();string nextFrameFilename = prefix + nextFrameNumberString + suffix;frame = imread(nextFrameFilename);if (frame.empty()) exit(EXIT_FAILURE);fn.assign(nextFrameFilename);                       // 更新图片路径}
}

运行结果

【OpenCV】视频/图像背景减除方法相关推荐

  1. 视频图像去模糊常用处理方法

    视频图像去模糊常用处理方法 随着"平安城市"的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于 ...

  2. opencv:视频读取的两种方法

    本文介绍视频的读取与显示,opencv视频读取有很多种方法,我们主要介绍两种常用的方法,首先介绍视频读取用到的函数: capture():capture函数是Videocapture类的一个读取视频或 ...

  3. OpenCV视频分析背景提取与前景提取

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 基本思想 OpenCV中支持的两种背景提取算法都是基于模型密度评估 ...

  4. paper 89:视频图像去模糊常用处理方法

    随着"平安城市"的广泛建设,各大城市已经建有大量的视频监控系统,虽然监控系统己经广泛地存在于银行.商场.车站和交通路口等公共场所,但是在公安工作中,由于设备或者其他条件的限制,案情 ...

  5. android 视频做背景图片,视频后面怎么加背景图片?安卓手机给视频添加背景图片的方法...

    狸窝是帮助用户解决问题 提供教程解决方案 在这个过程中有使用我们自己开发的软件 也有网上找的工具 只要帮助用户解决问题就好!同意则往下继续了解学习 ... 注意此教程方案是:『安卓手机端教程方案』.很 ...

  6. 视频加背景图片的方法,多个视频设置为相同的背景图

    大家在处理视频的时候,想要将一张图片添加上多个视频背景上,要如何操作呢?视频剪辑高手可以支持制作吗?小编的回答肯定是可以.下面一起来操作步骤. 准备多个视频及一张图片,保存在同一文件夹中 运行视频剪辑 ...

  7. 视频图像色彩增强的主要方法与落地实践

    背景 色彩增强作为视频后处理中画质增强技术的一部分,指的是通过调整图片和视频画面的饱和度特性,使得画面色彩更加丰富和逼真,提升人的视觉主观感受.由于设备摄像头的多样性,部分摄像头在视频采集时存在饱和度 ...

  8. 计算机视觉 | Python OpenCV 3 使用背景减除进行目标检测

    北京 | 高性能计算之GPU CUDA课程11月24-26日 3天密集学习 快速带你晋级 阅读全文 >

  9. OpenCV视频目标跟踪及背景分割器

    目标跟踪 本文主要介绍cv2中的视频分析Camshift和Meanshift. 目标: 学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体 Meanshift算法: mean ...

最新文章

  1. 【Python】Numpy简单入门
  2. es java聚合查询只有10_关于在elasticSearch中使用聚合查询后只显示10个bucket的问题...
  3. spring boot 日志文件配置(logback-spring.xml)亲测可用!
  4. 云栖社区Ruby技术社群建立啦!大家都想听什么?...
  5. 制作斜坡单元的两种方法
  6. 手把手,教你用MaxCompute+OpenSearch搭建分布式搜索引擎
  7. 软件工程概论总结第四章
  8. Reef Finance与Manta Network就流动性解决方案达成合作
  9. 腾讯专家详解Angel平台实操技巧,助你比赛一马当先!
  10. 集成学习—GBDT原理理解
  11. 磁力云播Android代码,磁力云播
  12. 江苏计算机小高考2016,2016江苏小高考成绩揭晓 生物化学4A不易
  13. laravel8的 Migration、Factory、Seeder
  14. 普通卷积、分组卷积和深度分离卷积概念以及参数量计算
  15. python 爬虫 表格,python爬虫爬取网页表格数据
  16. OOM问题原理解析(四):Bitmap压缩方案总结
  17. unity VR:MHD模拟手部动作总结
  18. linux smb 连上 断开,linux – 如何在客户端断开连接后阻止samba持有文件锁?
  19. Android中Activity、Window、ViewRootImpl与子线程更新UI
  20. discord Bot 实现机器人发送私信验证码

热门文章

  1. Resnet-18-训练实验-warm up操作
  2. pytorch学习笔记(五):线性回归的简洁实现
  3. Linux交叉编译+粤嵌LCD实现三色图
  4. hihocoder第229周:最大连续字母个数
  5. 最小方差问题---------------给你出道题
  6. mybatis字符串模糊匹配
  7. c/c++入门教程 - 3 职工管理系统 完整代码
  8. IO流 (四) ----- 转换流和标准字节输出流
  9. 运算符重载——递增运算符重载
  10. BigDecimal 计算余数