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;}
- opencv帧差法、中值滤波与二值化
- opencv中值滤波-双边滤波
- OpenCV中值滤波
- OPENCV中值滤波
- 中值滤波 opencv
- OpenCV—中值滤波
- 6.4OpenCV中值滤波
- opencv图像滤波——高斯滤波与中值滤波
- 基于opencv的中值滤波
- opencv中值滤波的源代码
- openCV 中值滤波算法解析
- C/C++ OpenCV中值滤波&双边滤波
- Opencv学习:非线性滤波:中值滤波、双边滤波
- OpenCV之九 非线性滤波专场:中值滤波、双边滤波
- 中值滤波与椒盐噪声
- 中值滤波与图像锐化
- 中值滤波与图像锐化
- 移动均值滤波与中值滤波
- SQL UNION
- Sprite Kit编程指南(7)-高级场景处理
- IOS学习笔记45--UITableView性能优化
- corona new button(按钮的使用)
- 1423 Greatest Common Increasing Subsequence (LCIS)
- opencv帧差法、中值滤波与二值化
- 【Wn8中如何关闭或开启自动播放功能】
- sql 选出所有人的最小成绩
- Strange Addition
- 同时设置两个 Bootstrap nav menus
- hdu 3940
- SOCKET API和TCP STATE的对应关系__三次握手(listen,accept,connect)__四次挥手close及TCP延迟确认(调用一次setsockopt函数,设置TCP_QUI
- Linux设备驱动程序——Linux设备驱动程序——内存和I/O基础知识学习:(2)内核中相关基础知识学习
- SSI(Struts2, Spring, iBatis)框架整合图示