图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

运动检测通常用于分析视频序列中的移动目标,如车辆和行人检测,其中所需要解决的关键问题是在场景中分离前景目标与背景。既然要分离,那就要先求解出背景,背景建模的作用就是对背景进行求解。求解出背景之后,利用当前图像帧与背景作差就可以粗略地实现运动目标区域点的提取。

常用的背景建模方法有混合高斯背景建模、KNN模型,下面分别给出各自在OpenCV下的代码实现,至于原理,目前我是没打算介绍,有兴趣的可以去参考相关论文和资料。

OpenCV中提供了BackgroundSubtractor类于用于实现背景建模算法。

一、混合高斯背景建模的OpenCV实现

OpenCV中提供了类BackgroundSubtractorMOG是经典的用于实现基于高斯混合模型的背景与前景分割算法,它派生于类BackgroundSubtractor。高斯混合模型的背景与前景分割算法在OpenCV3.1版本中被重新组织进新模块begsem中,具体原理请参考 P.KadewTraKuPong and R.Bowden发表的“An improved adaptive background mixture model for real-tiem tracking with shadow detection”。其改进型算法类为BackgroundSubtractorMOG2,改进后的算法实现了高斯混合模型参数的更新,增强了复杂场景背景检测的性能,具体原理请参考Z.Zivkovic的论文“Improved adaptive Gaussian mixture model for background subtraction”

高斯混合背景建模代码如下所示(代码中用到的视频链接下载地地址  https://pan.baidu.com/s/1hrIk2Ew):

//OpenCV版本3.0.0
//图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
//图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include <iostream>
#include <sstream>
using namespace cv;
using namespace std;
Mat frame;
Mat fgMaskMOG2;
Ptr<BackgroundSubtractor> pMOG2;
int keyboard;
void processVideo(string videoFilename)
{// 视频获取VideoCapture capture(videoFilename);if(!capture.isOpened()){// 输出视频文件打开错误信息cerr << "Unable to open video file: " << videoFilename << endl;exit(EXIT_FAILURE);}// 按下q键和esc退出while( (char)keyboard != 'q' && (char)keyboard != 27 ){// 读取当前帧if(!capture.read(frame)) {cerr << "Unable to read next frame." << endl;cerr << "Exiting..." << endl;exit(EXIT_FAILURE);}// 图像尺寸缩小cv::resize(frame, frame,cv::Size(), 0.25,0.25);//  背景模型生成pMOG2->apply(frame, fgMaskMOG2);// 输出当前帧号stringstream ss;rectangle(frame, cv::Point(10, 2), cv::Point(100,20),cv::Scalar(255,255,255), -1);ss << capture.get(CAP_PROP_POS_FRAMES);string frameNumberString = ss.str();// 左上角显示帧号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 = waitKey(30);}capture.release();
}
int main(int argc, char* argv[])
{// 创建背景建模类pMOG2 = createBackgroundSubtractorMOG2(); string inputPath = "car.avi";processVideo(inputPath);return 0;
}

运行结果如下图所示:

二、KNN模型背景建模实现

KNN模型是针对混合高斯背景模型的不足提出来的模型,具体混合高斯背景模型有哪些不足,这里不作介绍,目前博主也不清楚。该模型是由Z.Zivkovic、F.van der Heijden在2006年发表的论文“Efficient Adaptive Density Estimation per Image Pixel for the Task of Background Subtraction”中提出的,该方法应用K近邻思想,实现前景目标变换到较小场景模型下的背景模型的建立。OpenCV提供了类BackgroundSubtractorKNN来实现该算法,其成员函数setHistory可设定背景建模的历史帧数;函数setNSamples用于在后台设置样本模型;函数setNNSamples用于设置KNN中k参数(最近邻匹配数目);函数setDetectShadows实现阴影的启动或关闭操作。

BackgroundSubtractorKNN背景建模代码如下(代码中用到的视频链接下载地地址 car.avi_免费高速下载|百度网盘-分享无限制):

//OpenCV版本3.0.0
//图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
//图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601#include "opencv2/imgcodecs.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/videoio.hpp"
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include <iostream>
#include <sstream>
using namespace cv;
using namespace std;
void processVideo(Ptr<BackgroundSubtractorKNN> pBackgroundKnn, string videoFilename)
{cv::Mat frame,FGMask; int keyboard=0;// 视频获取VideoCapture capture(videoFilename);if(!capture.isOpened())exit(EXIT_FAILURE);// 按下q键和esc退出while( (char)keyboard != 'q' && (char)keyboard != 27 ){// 读取当前帧if(!capture.read(frame)) exit(EXIT_FAILURE);// 图像尺寸缩小cv::resize(frame, frame,cv::Size(), 0.2,0.2);// 背景建模参数设定pBackgroundKnn->setHistory(200);pBackgroundKnn->setDist2Threshold(600);pBackgroundKnn->setShadowThreshold(0.5);//  背景模型生成pBackgroundKnn->apply(frame, FGMask);// 输出当前帧号stringstream ss;rectangle(frame, cv::Point(10, 2), cv::Point(100,20),cv::Scalar(255,255,255), -1);ss << capture.get(CAP_PROP_POS_FRAMES);string frameNumberString = ss.str();// 左上角显示帧号putText(frame, frameNumberString.c_str(), cv::Point(15, 15),FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));// 输出结果imshow("Frame", frame);imshow("FGMask", FGMask);keyboard = waitKey(30);}capture.release();
}
int main(int argc, char* argv[])
{// 创建背景建模类Ptr<BackgroundSubtractorKNN> pBackgroundKnn = createBackgroundSubtractorKNN(); string inputPath = "car.avi";processVideo( pBackgroundKnn, inputPath);return 0;
}

运行结果如下图所示:

图像处理开发需求、图像处理接私活挣零花钱,请加微信/QQ 2487872782
图像处理开发资料、图像处理技术交流请加QQ群,群号 271891601

运动目标的背景建模-混合高斯背景建模和KNN模型建模的OpenCV代码实现相关推荐

  1. 运动目标检测_混合高斯背景建模

    1.混合高斯背景建模理论 混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量.每个模式的均值和标准差)表示背景,然后使用统计差分(如3 ...

  2. 运动目标检测混合高斯背景建模

    1.混合高斯背景建模理论 混合高斯背景建模是基于像素样本统计信息的背景表示方法,利用像素在较长时间内大量样本值的概率密度等统计信息(如模式数量.每个模式的均值和标准差)表示背景,然后使用统计差分(如3 ...

  3. 【图像处理基础知识】-混合高斯背景建模

    0.高斯模糊原理 转载地址:https://www.cnblogs.com/herenzhiming/articles/5276106.html --------------------------- ...

  4. opencv背景建模(混合高斯模型)

    背景建模 帧差法 由于场景中的目标在运动,目标的影像在不同图像帧中的位置不同.该类算法对时间上连续的两帧图像进行差分运算,不同帧对应的像素点相减,判断灰度差的绝对值,当绝对值超过一定阈值时,即可判断为 ...

  5. 混合高斯背景建模原理

    混合高斯背景建模 混合高斯模: 背景图像的每一个像素分别用由K个高斯分布构成的混合高斯模型来建模 P ( I ) = ∑ q = 1 Q w q N q ( I ; μ q , σ q 2 ) N q ...

  6. 混合高斯背景建模算法GMM

    高斯混合模型介绍 高斯混合模型(Gaussian Mixture Model)通常简称GMM,是一种业界广泛使用的聚类算法,该方法使用了高斯分布作为参数模型,并使用了**期望最大(Expectatio ...

  7. matlab 混合高斯背景建模的实现

    %根据opencv源代码改编 输入视频 输出一连串的黑白图像帧 clc; clear; %-------混合高斯背景建模 参数 ----------------- gauss_n = 3; %每个像素 ...

  8. python opencv 背景建模 混合高斯模型

    本文转载自别人博客 混合高斯模型:在进行前景检测前,先对背景进行训练,对图像中每个背景采用一个混合高斯模型进行模拟,每个背景的混合高斯的个数可以自适应.然后在测试阶段,对新来的像素进行GMM匹配,如果 ...

  9. 高斯背景建模 matlab,高斯背景建模整理 – 要饭的

    OpenCV 中高斯背景建模相关论文 BackgroundSubtractorMOG: Paper : An Improved Adaptive Background Mixture Model fo ...

最新文章

  1. 国内有没有能媲美Jira的测试管理工具?我们找国内产品来测评一下
  2. R-ArcGIS探秘(1)安装以及Sample执行
  3. linux基础系统命令大全
  4. CRM学习笔记(一)
  5. mysql分布式一致性hash_分布式哈希一致性
  6. 云图说 | 华为云医疗智能体智联大健康:AI医学影像
  7. 获取和设置消息队列的属性msgctl,删除消息队列
  8. 逆向工程平台 Radare2
  9. 关系型数据库的ACID特性
  10. 使用Hadoop搭建现代电信企业架构
  11. ssh连接docker容器
  12. FAT文件系统工作原理
  13. 浅析硬件构造Tone mapping曲线
  14. 行走在centos的弯路上:Restarting network (via systemctl):: Job for network.service failed. ...
  15. 【排序算法】冒泡排序|选择排序|插入排序|希尔排序
  16. Visual FoxPro 6.0常用命令
  17. 2个月涨600%,币安赵长鹏曾公开支持,乌鸦币将成2019最大黑马?
  18. Linux C/C++ 对于SIGBUS、SIGSEGV等崩溃异常捕获实现
  19. oracle数据库分页查询慢,Oracle数据库中分页查询中排序及效率问题
  20. Mysql 全文检索Demosql

热门文章

  1. python画动态爱心-使用Python画出小人发射爱心的代码
  2. python写程序求1-3+5-7+...-99+101的值-16-Python3-高价函数-提升效率必备
  3. python怎么导入视频-Python读取视频的两种方法(imageio和cv2)
  4. python循环语句-python中的for循环语句怎么写
  5. python开发桌面软件-python适合开发桌面软件吗?
  6. python报班大概多少钱-python培训班价格大概多少?
  7. python要不要装pycharm-subli(python要不要装pycharm)
  8. 小学生python-小学生都能学会的python(函数)
  9. python编写程序-在线python编程
  10. Linux中使用gcp拷贝报错:dbus.exceptions.DBusException: org.freedesktop.DBus.Error.NotSupported: