OpenCV_基于混合高斯模型GMM的运动目标检测
2016-05-26 11:24
567 查看
OpenCV的video module中包含了几种较为常用的背景减除方法,其中混合高斯模型(Gaussian of Mixture Models, GMM)方法效果较好。
常用的目标检测方法:1)帧间差分;2)背景减除;
其中背景减除方法的关键在于建立一个鲁棒的背景模型(背景图像),常用的建立背景模型方法有:
1)均值法;2)中值法;3)滑动平均滤波法;4)单高斯;5)混合高斯模型;6)codebook,等。
混合高斯模型的原理:
每个像素的R、G、B三个通道像素值的变化分别由一个混合高斯模型分布来刻画。这样的好处在于,同一个像素位置处可以呈现多个模态的像素值变化(例如水波纹,晃动的叶子等)。
GMM的出处:Adaptive background mixture models for real-time tracking (1999年由Chris Stau er提出)
OpenCV版本:2.4.2
下面的代码实现了基于GMM的运动目标检测,同时能够消除运动阴影; (基于文献:Improved adaptive Gausian mixture model for background subtraction)
[cpp] view
plain copy
// 基于混合高斯模型的运动目标检测
// Author: http://blog.csdn.net/icvpr
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
std::string videoFile = "../test.avi";
cv::VideoCapture capture;
capture.open(videoFile);
if (!capture.isOpened())
{
std::cout<<"read video failure"<<std::endl;
return -1;
}
cv::BackgroundSubtractorMOG2 mog;
cv::Mat foreground;
cv::Mat background;
cv::Mat frame;
long frameNo = 0;
while (capture.read(frame))
{
++frameNo;
std::cout<<frameNo<<std::endl;
// 运动前景检测,并更新背景
mog(frame, foreground, 0.001);
// 腐蚀
cv::erode(foreground, foreground, cv::Mat());
// 膨胀
cv::dilate(foreground, foreground, cv::Mat());
mog.getBackgroundImage(background); // 返回当前背景图像
cv::imshow("video", foreground);
cv::imshow("background", background);
if (cv::waitKey(25) > 0)
{
break;
}
}
return 0;
}
实验结果:
当前帧图像
当前背景图像
前景图像
经过腐蚀和膨胀处理后的前景图像
(白色为运动目标区域;灰色为阴影区域;黑色为背景)
-------------------------------------------------------
< 转载请注明:http://blog.csdn.net/icvpr>
常用的目标检测方法:1)帧间差分;2)背景减除;
其中背景减除方法的关键在于建立一个鲁棒的背景模型(背景图像),常用的建立背景模型方法有:
1)均值法;2)中值法;3)滑动平均滤波法;4)单高斯;5)混合高斯模型;6)codebook,等。
混合高斯模型的原理:
每个像素的R、G、B三个通道像素值的变化分别由一个混合高斯模型分布来刻画。这样的好处在于,同一个像素位置处可以呈现多个模态的像素值变化(例如水波纹,晃动的叶子等)。
GMM的出处:Adaptive background mixture models for real-time tracking (1999年由Chris Stau er提出)
OpenCV版本:2.4.2
下面的代码实现了基于GMM的运动目标检测,同时能够消除运动阴影; (基于文献:Improved adaptive Gausian mixture model for background subtraction)
[cpp] view
plain copy
// 基于混合高斯模型的运动目标检测
// Author: http://blog.csdn.net/icvpr
#include <iostream>
#include <string>
#include <opencv2/opencv.hpp>
int main(int argc, char** argv)
{
std::string videoFile = "../test.avi";
cv::VideoCapture capture;
capture.open(videoFile);
if (!capture.isOpened())
{
std::cout<<"read video failure"<<std::endl;
return -1;
}
cv::BackgroundSubtractorMOG2 mog;
cv::Mat foreground;
cv::Mat background;
cv::Mat frame;
long frameNo = 0;
while (capture.read(frame))
{
++frameNo;
std::cout<<frameNo<<std::endl;
// 运动前景检测,并更新背景
mog(frame, foreground, 0.001);
// 腐蚀
cv::erode(foreground, foreground, cv::Mat());
// 膨胀
cv::dilate(foreground, foreground, cv::Mat());
mog.getBackgroundImage(background); // 返回当前背景图像
cv::imshow("video", foreground);
cv::imshow("background", background);
if (cv::waitKey(25) > 0)
{
break;
}
}
return 0;
}
实验结果:
当前帧图像
当前背景图像
前景图像
经过腐蚀和膨胀处理后的前景图像
(白色为运动目标区域;灰色为阴影区域;黑色为背景)
-------------------------------------------------------
< 转载请注明:http://blog.csdn.net/icvpr>
相关文章推荐
- 买视频送图书-五月活动
- DVI 视频接口图文解析
- C#实现语音视频录制-附demo源码
- 编写C++程序使DirectShow进行视频捕捉
- AnyChat的视频会议程序实例详解
- C#调用mmpeg进行各种视频转换的类实例
- C#获取视频某一帧的缩略图的方法
- 基于jQuery的网页影音播放器jPlayer的基本使用教程
- 显示youtube视频缩略图和Vimeo视频缩略图代码分享
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- PHP使用ffmpeg给视频增加字幕显示的方法
- PHP实现将视频转成MP4并获取视频预览图的方法
- C++实现优酷土豆去视频广告的方法
- PHP简单获取视频预览图的方法
- asp.net 页面中添加普通视频的几种方式介绍
- php截取视频指定帧为图片
- Mac OS下为Android Studio编译FFmpeg解码库的详细教程
- Android Studio中配置OpenCV库开发环境的教程