(代码)三帧差分运动目标检测

上一篇文章介绍有原理,本文给出参考代码,注意,这里的代码仅仅有参考意义,并没有考虑工程实际中的效率,内存耗费等问题,望谅解。

int CallTime = 0;//定义调用次数计数器
IplImage* BackGroundImage;//上一帧灰度图
IplImage* DiffImage_1;//上一帧差分图的二值化图

void ThreeFrmDiff(IplImage* pColorIn)
{
	CallTime++;
	if(CallTime > 10)//防止溢出
	{
		CallTime = 10;
	}

	CvSize ImageSize = cvSize(pColorIn->width,pColorIn->height);
	IplImage* GrayImage = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);//当前帧的灰度图
	IplImage* GxImage = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);//当前帧的X方向梯度图
	IplImage* GyImage = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);//当前帧的Y方向梯度图
	IplImage* DiffImage = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);//当前帧的差分图
	IplImage* DiffImage_2 = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);//前一帧差分图
	IplImage* pyr = cvCreateImage(cvSize((ImageSize.width&-2)/2,(ImageSize.height&-2)/2),8,1); //进行腐蚀去除噪声的中间临时图片

	uchar* DiffImageData_2;
	DiffImageData_2 = (uchar*)DiffImage_2->imageData;//得到前一帧差分图的数据

	int height,width,step;//定义图像的高,宽,步长
	int SumInRect = 0;//指定矩形内图像数据之和
	int y1, y2, x1, x2;//对运动目标画框时的四个坐标点位置
	y1 = 0;
	y2 = 0;
	x1 = 0;
	x2 = 0;

	char Kx[9] = {1,0,-1,2,0,-2,1,0,-1};//X方向掩模,用于得到X方向梯度图
	char Ky[9] = {1,2,1,0,0,0,-1,-2,-1};//Y方向掩模,用于得到Y方向梯度图
	CvMat KX,KY;
	KX = cvMat(3,3,CV_8S,Kx);//构建掩模内核
	KY = cvMat(3,3,CV_8S,Ky);//构建掩模内核

	cvCvtColor(pColorIn,GrayImage,CV_BGR2GRAY);//将当前帧转化为灰度图
	cvSmooth(GrayImage,GrayImage,CV_GAUSSIAN,7,7);//进行平滑处理
	cvFilter2D(GrayImage,GxImage,&KX,cvPoint(-1,-1));//得到X方向的梯度图
	cvFilter2D(GrayImage,GyImage,&KY,cvPoint(-1,-1));//得到Y方向的梯度图
	cvAdd(GxImage,GyImage,GrayImage,NULL);//得到梯度图

	height = GrayImage->height;
	width = GrayImage->width;
	step = GrayImage->widthStep;

	CvRect rect;//定义矩形框

	if(CallTime == 1)//如果是第一帧
	{
		//对Image_1,BackGroundImage,DiffImage_1进行内存申请
		BackGroundImage = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);
		DiffImage_1 = cvCreateImage(ImageSize,IPL_DEPTH_8U,1);
		cvCopy(GrayImage,BackGroundImage,NULL);//如果是第一帧,设置为背景
	}
	else
	{
		cvAbsDiff(GrayImage,BackGroundImage,DiffImage);//得到当前帧的差分图
		cvCopy(GrayImage,BackGroundImage,NULL);//将当前帧的梯度图作为下一帧的背景
		cvThreshold(DiffImage,DiffImage,15,255,CV_THRESH_BINARY);//二值化当前差分图
		if(CallTime > 2)//如果大于等于第三帧
		{
			cvAnd(DiffImage,DiffImage_1,DiffImage_2);//进行“与”运算,得到前一帧灰度图的“准确”运动目标
			char str[256];
			memset(str, '\0', 256*sizeof(char));
			static int iCount = 0;
			sprintf(str, "./img/%d.jpg", iCount++);
			cvSaveImage(str, DiffImage_2);
		}
		cvPyrDown(DiffImage_2,pyr,7);//向下采样
		cvErode(pyr,pyr,0,1);//腐蚀,消除小的噪声
		cvPyrUp(pyr,DiffImage_2,7);
		cvCopy(DiffImage,DiffImage_1,NULL);//备份当前差分图的二值化图
	}

	cvReleaseImage(&GxImage);
	cvReleaseImage(&GyImage);
	cvReleaseImage(&GrayImage);
	cvReleaseImage(&DiffImage);
	cvReleaseImage(&DiffImage_2);
	cvReleaseImage(&pyr);
}
时间: 2024-12-29 11:25:42

(代码)三帧差分运动目标检测的相关文章

运动目标检测ViBe算法

一.运动目标检测简介   视频中的运动目标检测这一块现在的方法实在是太多了.运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测.先简单从视频中的背景类型来讨论.        静态背景下的目标检测,就是从序列图像中将实际的变化区域和背景区分开了.在背景静止的大前提下进行运动目标检测的方法有很多,这些方法比较侧重于背景扰动小噪声的消除,如:1.背景差分法2.帧间差分法3.光流法4.混合高斯模型(GMM)5.码本(codebook)还有这些方法的变种,例如三帧

静态背景下运动目标检测

前言:运动对象常用在视频监控领域,目的是从序列图像中将变化区域从背景图像中提取出来,运动区域的有效检测对目标分类.跟踪.行为理解等后期处理非常重要.根据摄像机与运动目标之间的关系可分为静态背景下的运动目标检(摄像机静止)和动态背景下的运动目标检测(摄像机也同时运动).项目中我用到的是静态背景下的运动目标检测,需通过固定摄像机检测运动物体,并完成抓取动作. 内容: 运动目标检测常用的方法一般分为两大类,一种是基于特征的方法,另一种是基于灰度的方法.基于特征的方法是依据图像的特征来检测运动目标,多用

OpenCV运动目标检测——帧间差,混合高斯模型方法

一.简单的帧间差方法 帧差法是在连续的图像序列中两个或三个相邻帧间采用基于像素的时间差分并且闽值化来提取图像中的运动区域. 代码: int _tmain(int argc, _TCHAR* argv[]) { VideoCapture capture("bike.avi"); if(!capture.isOpened()) return -1; double rate = capture.get(CV_CAP_PROP_FPS); int delay = 1000/rate; Mat

【转】 运动目标检测跟踪主流算法

不全,需要慢慢补充 一.运动目标检测 (一)背景差 1.帧差 2.GMM 等 背景减算法可以对背景的光照变化.噪声干扰以及周期性运动等进行建模,在各种不同情况下它都可以准确地检测出运动目标.因此对于固定摄像头的情形,目前大多数的跟踪算法中都采用背景减算法来进行目标检测.背景减算法的局限性在于它需要一个静态的固定摄像头. (二)运动场 光流法 光流估计的方法都是基于以下假设:图像灰度分布的变化完全是目标或者场景的运动引起的,也就是说,目标与场景的灰度不随时间变化.这使得光流方法抗噪声能力较差,其应

运动目标检测--改进的背景减法

一.概述 本文提出了一种改进的基于背景减法的运动目标检测算法,该算法能自适应地对背景进行初始化和实时更新,并能有效克服光照等外界条件变化对运动目标检测的影响. 二.算法介绍 基于背景减法的视频运动目标检测主要包括预处理.背景建模.目标检测和后处理四个步骤.本文的算法流程如图 1 所示,算法中的预处理是对每一帧图像都进行去噪和亮度归一化处理,以抑制光照突变和噪声的影响:背景建模则采用改进的均值滤波法自动初始化背景,并不断实时更新背景,以克服环境光照变化所产生的影响:目标检测是在背景减法的基础上采用

对这个运动目标检测方法实现的结果A Hybrid Algorithm for Moving Object Detection

最近在做烟火检测,需要用到运动检测,看到论文A System for Video Surveillance and Monitoring中的A Hybrid Algorithm for Moving Object Detection这个方法,我用opencv将其实现,代码下面会贴出,但是其的到的结果很差,不知道代码哪里出了问题,请高手给予指点,谢谢! 左图为原图,有图为用上面论文中的方法得到前景图像,[自己的代码可能写错了,请大神们给予指点谢谢] 代码如下: #include <stdio.h>

三帧帧差法改进——使用循环队列减少深拷贝

使用循环队列的三帧帧差法 帧差法是背景减图法中的一种,只不过是帧差法不需要建模,因为它的背景模型就是上一帧的图,所以速度非常快.对于帧差法的"双影"现象,有人提出来了三帧差法.其原理如下所示: 1. 由I(t) - I(t-1)得到前景图   F1 2. 由I(t+1) - I(t)得到前景图  F2 3.  F1 ∩ F2得到前景图        F3 为了减少图像深拷贝带来的时间开销,我使用了一个储存三帧图像的循环队列,只需调整队首.队尾指针,就可以定位相对的前.中.后三帧,避免直

运动目标检测跟踪各过程算法综述

运动目标检测跟踪各过程算法综述 图像预处理数字图像中的几种典型噪声有:高斯噪声来源于电子电路噪声和低照明度或高温带来的传感器噪声:椒盐噪声类似于随机分布在图像上的胡椒和盐粉微粒,主要由图像切割引起或变换域引起的误差:加性噪声是图像在传输中引进的信道噪声.一般来说,引入的都是加性随机噪声,可以采用均值滤波.中值滤波.高斯滤波等方法去除噪声,提高信噪比.均值滤波在噪声分布较平均,且峰值不是很高的情况下能够得到较好的应用:中值滤波对尖脉冲噪声的滤除有较好的效果,并且能突出图像的边缘和细节:高斯滤波对滤

.NET代码混淆控件Dotfuscator检测篡改

.NET混淆器Dotfuscator提供了强大的篡改防御和提示功能,可以有效地检测篡改,注入事实篡改防御,以及自动化事故管理和响应.本文主要介绍如何利用.NET代码混淆器Dotfuscator检测应用程序的篡改. Dotfuscator包含了一个篡改检测工具,它位于Dotfuscator文件夹中(C:\Program Files\PreEmptive Solutions\Dotfuscator Professional Edition 4.4\TamperTester.exe). 测试篡改步骤如