opencv-视频处理--实时前景检测-二帧差法_Captain_zp的博客-程序员宝宝

技术标签: liunx+opencv  帧差法  视频处理  opencv之视频处理  图像处理、OpenCV、Python、计算机视觉  前景检测  opencv  

原视频


主要思想:

通过当前帧的灰度图(currentGrayFrame)和前一帧的灰度图(previousGrayFrame)的差,进行像素级的比较。


符号:

:代表当前帧(x,y)处的灰度值

:代表前一帧(x,y)处的灰度值

:代表当前帧和上一帧在(x,y)处的差的绝对值

如果

:差值大于阈值Thresh,代表是前景点

:差值小于阈值Thresh,代表为背景点


优点:

实时性


缺点:

1、运动物体如果过大,且颜色一致,则会造成运动物体中空的现象

2、如果光照变化强烈,也不适合该算法

代码:

#include<iostream>
using namespace std;
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;

const unsigned char FORE_GROUD = 255;
int thresh = 30;

int main(int argc,char*argv[])
{	
	
	VideoCapture video(argv[1]);

	//判断如果video是否可以打开
	if(!video.isOpened())
		return -1;
	
	//用于保存当前帧的图片
	Mat currentBGRFrame;
	
	//用来保存上一帧和当前帧的灰度图片
	Mat previousGrayFrame;
	Mat currentGaryFrame;

	//用来保存帧差
	Mat frameDifference;//CV_16SC1

	//用来保存帧差的绝对值
	Mat absFrameDifferece;

	//用来显示前景
	Mat segmentation;
	
	//显示原视频
	namedWindow("video",1);

	//显示前景
	namedWindow("segmentation",1);
	createTrackbar("阈值:","segmentation",&thresh,FORE_GROUD,NULL);

	//帧数
	int numberFrame = 0;

	//形态学处理用到的算子
	Mat morphologyKernel = getStructuringElement(MORPH_RECT,Size(3,3),Point(-1,-1));
	
	for(;;)
	{
		//读取当前帧
		video >> currentBGRFrame;

		//判断当前帧是否存在
		if(!currentBGRFrame.data)
			break;

		numberFrame++;
		
		if( numberFrame == 1)
		{
			//颜色空间的转换
			cvtColor(currentBGRFrame,currentGaryFrame,COLOR_BGR2GRAY);
			//保存当前帧的灰度图
			previousGrayFrame = currentGaryFrame.clone();
			imshow("video",currentBGRFrame);
			continue;
		}
		else
		{
			//颜色空间的转换
			cvtColor(currentBGRFrame,currentGaryFrame,COLOR_BGR2GRAY);
			
			//src1-src2
			subtract(currentGaryFrame,previousGrayFrame,frameDifference,Mat(),CV_16SC1);
			
			//取绝对值
			absFrameDifferece = abs(frameDifference);
			
			//位深的改变
			absFrameDifferece.convertTo(absFrameDifferece,CV_8UC1,1,0);

			//阈值处理
			threshold(absFrameDifferece,segmentation,double(thresh),double(FORE_GROUD),THRESH_BINARY);

			//中值滤波
			medianBlur(segmentation,segmentation,3);

			//形态学处理(开闭运算)
			//morphologyEx(segmentation,segmentation,MORPH_OPEN,morphologyKernel,Point(-1,-1),1,BORDER_REPLICATE);
			morphologyEx(segmentation,segmentation,MORPH_CLOSE,morphologyKernel,Point(-1,-1),2,BORDER_REPLICATE);
						
			//显示二值化图片
			imshow("segmentation",segmentation);

			//找边界
			vector< vector<Point> > contours;
			vector<Vec4i> hierarchy;
			findContours( segmentation, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0) );//CV_RETR_TREE
			vector< vector<Point> > contours_poly( contours.size() );
		
			/*存储运动物体*/
			vector<Rect> boundRect;
			boundRect.clear();

			//画出运动物体
			//对视频中出现的运动物体,进行初次的筛选
			for(int index = 0;index < contours.size() ;index++)
			{
				approxPolyDP( Mat(contours[index]), contours_poly[index], 3, true );
				Rect rect =  boundingRect( Mat(contours_poly[index]) );
				rectangle(currentBGRFrame,rect,Scalar(0,255,255),2);
			}

			//显示原视频
			imshow("video",currentBGRFrame);

			//保存当前帧的灰度图
			previousGrayFrame = currentGaryFrame.clone();
		}

		if(waitKey(33) == 'q')
			break;

	}
	return 0;
}




发现当运动的颜色,很接近时,前景检测运动物体容易出现空洞。


--下一篇会介绍对二帧差法的改进,三帧差法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wxcdzhangping/article/details/51801586

智能推荐

mysql一键执行脚本 超方便!!!_一键执行交背的_朝花夕誓、的博客-程序员宝宝

mysql一键执行脚本mysql一键执行脚本mysql一键执行脚本在初始虚拟机上,直接复制就ok了#!/bin/bashecho "-------编译安装mysqld 服务--------"#将安装mysql 所需软件包传到/opt目录下#mysql-5.7.17.tar.gz#boost_1_59_0.tar.gz #支持c++的运行库echo "安装环境依赖包"yum -y install gcc gcc-c++ ncurses ncurses-devel bison cm

HDOJ1426 DFS深搜基础入门题_老年退役选手的博客-程序员宝宝

Sudoku KillerTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 8222    Accepted Submission(s): 2532Problem Description自从2006年3月10日

oracle 11g rac update_bjibm1188的博客-程序员宝宝

root身份执行(两节点)  cd /grid/racmv OPatch OPatch_oldcd /u01/oracle/product/11.2/db_1/mv OPatch OPatch_oldcp -R OPatch /grid/rac/cd /grid/rac/chown -R grid:oinstall OPatchcp -R OPatch /u01/oracle/product/11...

效率软件推荐(一)_谓之小一的博客-程序员宝宝

工欲善其事,必先利其器,为此给大家推荐几款效率软件,帮助你高效学习和工作。 + 滴答清单:解决拖延症&amp;amp;amp;amp;&amp;amp;amp;amp;健忘症,高效完成任务和规划时间。 + 印象笔记: 收集各类信息,捕捉灵感,做你的第二大脑。 + 夸克浏览器:极简风格,满足你对浏览器最本质的需求。1.滴答清单身边的人多多少都有点拖延症(包括我),不到DeadLine的时候,都不会想到去解决问题。为此还耽误了几...

docker如何下载国外镜像_docker 镜像下载_明快de玄米61的博客-程序员宝宝

我们对红框框中的两行命令进行说明,第1行的作用是镜像重命名,为上传到阿里云镜像仓库做准备。,但是在下载下面3个镜像的时候却失败了,无论切换什么镜像源都无济于事,所以给大家介绍一种方案来下载国外镜像。就是镜像id(说明:可以通过docker images查看对应镜像id),而。创建个人实例之后需要设置仓库密码,该密码用于镜像上传下载,这里不再指出。,其中登录我们已经完成了,那么只需要完成下图红框框中的两步就可以了,其中。点击回车键之后,输入我们为阿里云镜像仓库设置的密码就可以完成登录了。

Linux的简易安装_weixin_33829657的博客-程序员宝宝

本文介绍在虚拟机VMware Workstation上安装小红帽Linux系统一,创建虚拟机。创建后的结果如图二,按enter,进入安装模式三,点击下一步,下一步,下一步(安装语言→键盘类型→鼠标类型)四,分区(很关键),如果不会分区就点击自动分区,弹出警告后,点击“是”分区后的硬盘,再点击“下一步”四,设置根口令(很重要,要记住),再点击“下一步”五,等待。然后就搞定了 ...

随便推点

(PTA)7-2 比较大小 (10分)_7-73 比较大小 分数 10 作者 杨起帆 单位 浙大城市学院 本题要求将输入的任意3个_Overdrive13的博客-程序员宝宝

本题要求将输入的任意3个整数从小到大输出。输入格式:输入在一行中给出.3个整数,其间以空格分隔。输出.格式:在一行中将3个整数从小到大输出,其间以“-&gt;”相连。输入样例:4 2 8输出.样例:2-&gt;4-&gt;8#include&lt;stdio.h&gt;int main(){int x,y,z;int a,b,c;scanf("%d%d%d",&amp;...

请问在CODEVISION AVR C中如何在函数中传递数组的地址?_mybirdsky的博客-程序员宝宝

2007-12-24 16:00:16 void main(void){ char temp_buffer[50]; ...... send_data(temp_buffer); ........}void send_data(data_buffer)char data_buffer[50];{ ......}编译后提示,bad decla

xen-3.3.1安装_xen3*3_yhxjldx的博客-程序员宝宝

环境:主机的操作系统是XP,安装VMware,在vmware上安装centos5.3,在centos5.3上安装xen。以下内容大多转载自http://blog.csdn.net/jcwkyl.1。从http://www.xen.org/download/index_3.3.1.html下载xen-3.3.1.tar.gz和linux-2.6.18-xen-3.3.0.tar.gz。在xp下下

面试大厂前先搞定这些常问的MySQL面试题_PHP开源社区的博客-程序员宝宝

1、事物的并发?事物隔离级别,每个级别会引发什么问题?MySQL默认是哪个级别?事物应该彼此完全隔离,以避免并发事物所导致的问题,然而,那样会对性能产生极大的影响,因为事物必须按顺序运行,在实际开发中,为了提升性能,事物会以较低的隔离级别运行,事物隔离级别可以通过隔离事物属性指定。事务的并发问题1)脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据。2)不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,

线段树扫描线模板及感悟_线段树扫描线模板的理解_jokersio的博客-程序员宝宝

线段树扫描线模板及感悟扫描线问题算是一个线段树问题的简单变种。模型是在一个平面内给n个有重叠部分的矩形,求其覆盖的面积。思路是将矩形的上下边界看作扫描线,同时离散化x坐标用线段树维护,维护的是离散后的每个区间不是离散后的点,是(n-1)个!!!!!维护两个值,一个是cnt即覆盖在其上方的矩阵数量(可通过扫描线是矩形的上边界还是下边界,从而+1/-1来判断),另一个是sum即每个区间内被覆盖的长度。而每次增加的面积就是sum[1]乘以两条扫描线之间的高度差。需要注意的是,因为我们每次只需要的是sum[1

网络入门基础_网络技术入门_2021dragon的博客-程序员宝宝

文章目录计算机网络背景网络发展认识“协议”网络协议初始协议分层OSI七层模型TCP/IP五层(或四层)模型网络传输基本流程网络传输流程图数据包封装和分用网络中的地址管理认识IP地址认识MAC地址计算机网络背景网络发展认识“协议”网络协议初始协议分层OSI七层模型TCP/IP五层(或四层)模型网络传输基本流程网络传输流程图数据包封装和分用网络中的地址管理认识IP地址认识MAC地址...

推荐文章

热门文章

相关标签