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

来源:互联网 发布:物理机安装centos系统 编辑:程序博客网 时间:2024/06/07 19:58

使用工具:vs2010+opencv2.4.3

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

#include "stdafx.h"#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#include <iostream>#include<strstream>#include<string.h>#include<fstream>#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!"<<endl;//获取整个视频的帧数long totalFrameNumber = capture.get(CV_CAP_PROP_FRAME_COUNT);  cout<<"整个视频共:"<<totalFrameNumber<<"帧"<<endl;//获取帧率double rate=capture.get(CV_CAP_PROP_FPS);cout<<"该视频帧率为:"<<rate<<endl;    //保存视频CvSize size=cvSize(480,272);int fps=25;VideoWriter writer=VideoWriter("D:\\chenxu\\tp.avi",-1,fps,size,1);for(int d=0;;d++){if(!pause){capture >>frame1;        //因为视频文件帧数已经固定了,所以每次到这句语句都是读取相邻的帧数,没到时间视频并不向前走frame[d]=frame1;cvtColor(frame[d],gray[d],CV_BGR2GRAY);//将原图转化为RGB图像,即得到灰度图像cout<<"当前帧为第"<<d<<"帧"<<endl;imshow("video_src",frame1);//可以事先不用新建一个窗口,显示原视频waitKey(5);//保存视频writer.write(frame1);if(d>=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<uchar>(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<uchar>(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<gray_diff.rows;i++)for(int j=0;j<gray_diff.cols;j++)if(abs(gray_diff.at<unsigned char>(i,j))>=threshold_diff)//这里模板参数一定要用unsigned char,否则就一直报错gray_diff.at<unsigned char>(i,j)=255;else gray_diff.at<unsigned char>(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);}}elsed--;//按键控制视频播放char c=(char)waitKey(60);if (c==27){break;    }if(c==' ')pause=!pause;}return 0;}


 

 

原创粉丝点击