opencv帧差法、中值滤波与二值化

使用工具:vs2010+opencv2.4.3

读视频、将视频前后帧图像像素值相减、将差值图像转化为灰度图并二值化(阈值为25)、之后进行中值滤波、将帧号写入滤波后的图像并把每帧保存、播放处理后的视频帧以及原始视频帧、在当前文件夹下生成处理后的视频文件。

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include
#include
#include
#define threshold_diff 25 //设置简单帧差法阈值

using namespace cv;
using namespace std;
int main(int argc,unsigned char* argv[])
{
	Mat img_dst,gray[2000],gray_diff,frame[2000],frame1,rst;
	bool pause=false;

	//在这里修改相应的输入视频名
	//CvCapture *capture=cvCaptureFromAVI("D:/chenxu/test.avi");
	VideoCapture capture("D:/chenxu/test.avi");

	//检查视频是否正常打开,如果正常打开isOpened()返回ture;
	if(!capture.isOpened())
		cout<<"fail to open!"<>frame1;        //因为视频文件帧数已经固定了,所以每次到这句语句都是读取相邻的帧数,没到时间视频并不向前走
			frame[d]=frame1;
			cvtColor(frame[d],gray[d],CV_BGR2GRAY);//将原图转化为RGB图像,即得到灰度图像
			cout<<"当前帧为第"<=1)
			{

				//中值滤波(调用库函数,也可以自己编译实现)
				medianBlur(frame1,rst,3);
				
/*Mat medianFilter( Mat frame1 )//对灰度图像进行操作,于是只有一个通道
{
	Mat result;
	result = frame1.clone();

	for( int y = 1; y < frame1.rows - 1; y++ )
	{
		uchar* result_data  = result.ptr(y);
		for( int x = 1; x < frame1.cols - 1; x++)
		{
			int k=0;
			uchar temp[9];
			for(int yy = y-1; yy < y+2; yy++ )//将所有值存入临时数组
			{
				uchar* data  = frame1.ptr(yy);
				for( int xx = x-1; xx < x+2; xx++ )
				{
					temp[k] = * ( data+xx );
					k++;
				}
			}
			//找数组的中值,按从小到大顺序排列,中间的便是中值
			for( int m = 0; m < 5; m++ )
			{
				int min = m;
				for(int n = m+1; n < 9; n++ )
					if( temp[n] < temp[min] )
					{
						min = n;
						uchar Temp = temp[m];
						temp[m] = temp[min];
						temp[min] = Temp;
					}
			}
						
			* (result_data + x) = temp[4];
		}
					
	}
	return result;
}*/
				imshow("after filter",rst);//显示滤波后的视频

				//帧差法(调用库函数,也可以自己编译实现)
				subtract(gray[d-1],gray[d],gray_diff);

				//图像二值化
				for(int i=0;i(i,j))>=threshold_diff)//这里模板参数一定要用unsigned char,否则就一直报错
							gray_diff.at(i,j)=255;
						else gray_diff.at(i,j)=0;

						imshow("foreground",gray_diff);//显示经二值化后帧差法后的视频
						
						//保存图片
						char image_name[13];			
						sprintf(image_name, "%s%d%s", "image", d, ".jpg");//保存的图片名
						imwrite( image_name, frame[d]); //保存每一帧图片

						waitKey(5);

			}
		}
		else
			d--;
		//按键控制视频播放
		char c=(char)waitKey(60);
		if (c==27)
		{
			break;    
		}
		if(c==' ')
			pause=!pause;
	}

	return 0;
}


 

 

你可能感兴趣的:(opencv)