背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤。如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象。但是在大多数情况下,我们可能没有这样的图像,所以我们需要从我们拥有的任何图像中提取背景。当运动物体有阴影时,由于阴影也在移动,情况会变的变得更加复杂。为此引入了背景减除算法,通过这一方法我们能够从视频中分离出运动的物体前景,从而达到目标检测的目的。

MOG2

MOG2算法,也是高斯混合模型分离算法,是MOG的改进算法。它基于Z.Zivkovic发布的两篇论文,即2004年发布的“Improved adaptive Gausian mixture model for background subtraction”和2006年发布的“Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction”中提出。该算法的一个重要特征是 它为每个像素选择适当数量的高斯分布,它可以更好地适应不同场景的照明变化等。

基本思路:

混合高斯模型:

将图像分为3-5个高斯模型,一个像素点来了,如果该像素点离任何一个高斯模型的距离大于其2倍的标准差,则为前景即运动物体,否则则是背景

步骤:第一步:初始各种参数

第二步:使用T帧图像构造模型,对于第一个帧图像的第一个像素点,使用u1,σ1构造高斯模型

第三步:对于一个新来的模型,如果该像素在高斯模型3*σ1内,则属于该高斯模型,对参数进行更新

第四步:如果不满足该高斯模型,重新建立一个新的高斯模型


//构造高斯混合模型
Ptr<BackgroundSubtractor> ptrMOG2 = createBackgroundSubtractorMOG2();//getStructuringElement构造形态学使用的kernel
Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
//运用高斯模型进行拟合,在两个标准差内设置为0,在两个标准差外设置为255
ptrMOG2->apply(frame, bgMask_MOG2);//使用形态学的开运算做背景的去除
morphologyEx(bgMask_MOG2, bgMask_MOG2, MORPH_OPEN, kernel);

完整项目代码,可以进行读写视频:

#include <iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/opencv.hpp>
#include<cstdio>
using namespace std;
using namespace cv;int main()
{VideoCapture video = VideoCapture("F:\\计算机视觉\\c5.mp4");VideoWriter write;double fps = video.get(CV_CAP_PROP_FPS); //获取视频帧率double pauseTime = 1000 / fps; //两幅画面中间间隔int w = static_cast<int>(video.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(video.get(CV_CAP_PROP_FRAME_HEIGHT));cv::Size S(w, h);write.open("testMOGMask.avi", -1, fps, S, true);if (!video.isOpened()) {cout << "could not load video file ..." << endl;return -1;}Mat frame, bgMask_MOG2, bgMask_KNN, background;Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));namedWindow("highway_test", WINDOW_AUTOSIZE);namedWindow("background_mask_by_MOG2", WINDOW_AUTOSIZE);Ptr<BackgroundSubtractor> ptrMOG2 = createBackgroundSubtractorMOG2();while (video.read(frame)) {imshow("highway_test", frame);ptrMOG2->apply(frame, bgMask_MOG2);morphologyEx(bgMask_MOG2, bgMask_MOG2, MORPH_OPEN, kernel);imshow("background_mask_by_MOG2", bgMask_MOG2);write.write(bgMask_MOG2);char c = waitKey(50);if (c == 27) {break;}}//waitKey(0);write.release();video.release();cv::destroyWindow("video");return 0;
}

       

                      

KNN

KNN算法,即K-nearest neigbours - based Background/Foreground Segmentation Algorithm。2006年,由Zoran Zivkovic 和Ferdinand van der Heijden在论文"Efficient adaptive density estimation per image pixel for the task of background subtraction."中提出。

Ptr<BackgroundSubtractor> ptrKNN = createBackgroundSubtractorKNN();
ptrKNN->apply(frame, bgMask_KNN);

完整代码,可以读取视频,写入视频,并提取前后景

//以下代码用OpenCV实现了视频中背景消除和提取的建模,涉及到KNN(K近邻算法)
#include <iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/opencv.hpp>
#include<cstdio>
using namespace std;
using namespace cv;int main()
{VideoCapture video = VideoCapture("F:\\计算机视觉\\c5.mp4");VideoWriter write;double fps = video.get(CV_CAP_PROP_FPS); //获取视频帧率double pauseTime = 1000 / fps; //两幅画面中间间隔int w = static_cast<int>(video.get(CV_CAP_PROP_FRAME_WIDTH));int h = static_cast<int>(video.get(CV_CAP_PROP_FRAME_HEIGHT));cv::Size S(w, h);write.open("testKNNMASK.avi", -1, fps, S, true);if (!video.isOpened()) {cout << "could not load video file ..." << endl;return -1;}Mat frame, bgMask_KNN, background;namedWindow("highway_test", WINDOW_AUTOSIZE);//namedWindow("background_mask_by_MOG2", WINDOW_AUTOSIZE);//namedWindow("background_by_KNN", WINDOW_AUTOSIZE);namedWindow("background_mask_by_KNN", WINDOW_AUTOSIZE);Ptr<BackgroundSubtractor> ptrKNN = createBackgroundSubtractorKNN();while (video.read(frame)) {imshow("highway_test", frame);ptrKNN->apply(frame, bgMask_KNN);//ptrKNN->getBackgroundImage(background);//imshow("background_by_KNN", background);imshow("background_mask_by_KNN", bgMask_KNN);write.write(bgMask_KNN);char c = waitKey(50);if (c == 27) {break;}}write.release();video.release();cv::destroyWindow("video");return 0;
}

原视频如上图所示,下面是效果视频:

    

基于opencv的BackgroundSubtractorMOG2和BackgroundSubtractorKNN通过背景减除来实现目标追踪相关推荐

  1. 基于opencv的BackgroundSubtractorMOG2目标追踪

    基于opencv的BackgroundSubtractorMOG2目标追踪 BackgroundSubtractorMOG2是以高斯混合模型为基础的背景/前景分割算法.它是以2004年和2006年Z. ...

  2. cv2 inrange灰度图_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  3. opencv 轮廓放大_基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析...

    title: [python]基于openCV,PIL的深色多背景复杂验证码图像转灰度二值化,并去噪降噪处理分析 type: categories copyright: true categories ...

  4. 基于OpenCV+CUDA实时视频抠绿、背景合成以及抠绿算法小结

    一.关于抠绿 百度百科上描述抠绿"抠绿是指在摄影或摄像时,以绿色为背景进行拍摄,在后期制作时使用特技机的"色键"将绿色背景抠去,改换其他更理想的背景的技术."绿 ...

  5. C++基于OpenCV实现实时监控和运动检测记录

    基于OpenCV实现实时监控并通过运动检测记录视频 一.课程介绍 1. 课程来源 课程使用的操作系统为 Ubuntu 14.04,OpenCV 版本为OpenCV 2.4.13.1,你可以在这里查看该 ...

  6. mask rcnn属于dnn么_基于OpenCV DNN的 MaskRCNN 目标检测与实例分割

    这里主要记录基于 OpenCV 4.x DNN 模块和 TensorFlow MaskRCNN 开源模型的目标检测与实例分割 的实现. MaskRCNN 不仅可以检测图片或视频帧中的物体边界框,还可以 ...

  7. 基于OpenCV创建视频会议虚拟背景

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本期我们将使用Python和OpenCV为视频会议创建虚拟背景. ...

  8. 基于opencV的动态背景下运动目标检测及跟踪(修改版)

    基于openCV的动态背景下的运动目标检测 from: http://www.mianfeiwendang.com/doc/89c6692a222a84b2ced0d502/1 摘要:介绍在动态背景下 ...

  9. opencv jpg作为png背景_基于OpenCV与tensorflow实现实时手势识别

    公众号[OpenCV学堂],致力于计算机视觉开发技术传播,原创技术文章200+的,涉及OpenCV开发.tensorflow开发.模型解析与训练.传统图像处理算法解析,对图像与视觉感兴趣的强烈推荐关注 ...

最新文章

  1. overflow超出显示_[CSS]text-overflow: ellipsis;什么时候可能不生效?
  2. Vagrant控制管理器——“Hobo”
  3. Docker常用基础命令汇总
  4. mysql 5.6 缓存_为什么默认情况下从MySQL 5.6开始禁用query_cache_type?
  5. substring()函数用法
  6. 取模除法(逆元)(费马小定理)(线性求逆元)
  7. UVA - 10474
  8. JavaScript学习(五十九)—原型、原型链、闭包以及闭包的不足
  9. label标签for属性的使用
  10. 算法——X^3+Y^3+Z^3=XYZ(水仙花数)
  11. php 导出文件另行指定路径,生成excel文件到指定目录的函数php类库
  12. eclipse Git使用教程
  13. Minimax算法——井字棋
  14. 【论文泛读18】利用BERT进行端到端面向方面的情感分析
  15. MP3音频解码详细过程(二)
  16. 中兴网络设备交换机路由器查看MC-LAG状态检查命令方法
  17. 房子要室内设计了,先从讲装修的施工工艺开始!
  18. 06-图3. 六度空间 (30)
  19. 什么时候用重定向,什么时候用请求转发。
  20. OCP 12c最新考试题库及答案(071-2)

热门文章

  1. mysql: “Warning: Using a password on the command line interface can be insecure.“ 解决方法
  2. 网络对抗 Exp3 免杀原理与实践 20154311 王卓然
  3. Chapter3:根轨迹法(上)
  4. js金额千分位 及 清除千分位
  5. 辨识模型ARMA、ARMAX、ARIMA、ARIMAX
  6. RISC-V要上天!NASA选它做下一代航天计算芯片
  7. OJ——计算并联电阻的阻值
  8. linux下搜索文件和文件夹
  9. python 正则表达式
  10. Java 生成帮助文档