#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main (int argc, char** argv)
{
VideoCapture capture("2.avi");
if (!capture.isOpened())
{
cout<<"No camera or video input!\n"<<endl;
return -1;
}
Mat frame;
Mat gray ;
Mat gray_dilate1 ;
Mat gray_dilate2 ;
Mat gray_dilate3 ;
Mat background,foreground,foreground_BW;
Mat mid_filer; //中值濾波法後的照片
//---------------------------------------------------------------------
//獲取視頻的寬度、高度、幀率、總的幀數
int frameH = capture.get(CV_CAP_PROP_FRAME_HEIGHT); //獲取幀高
int frameW = capture.get(CV_CAP_PROP_FRAME_WIDTH); //獲取幀寬
int fps = capture.get(CV_CAP_PROP_FPS); //獲取幀率
int numFrames = capture.get(CV_CAP_PROP_FRAME_COUNT); //獲取整個幀數
int num=numFrames;
printf("vedio's \nwidth = %d\t height = %d\n video's fps = %d\t nums = %d", frameW, frameH, fps, numFrames);
//---------------------------------------------------------------------
Mat frame_0,frame_1;//Mat m(3, 5, CV_32FC1, 1);
//---------------------------------------------------------------------
while(1)
{
capture>>frame;
imshow("frame_resize",frame);
cvtColor( frame,gray, CV_RGB2GRAY );
//-----------------------------------------------------------------------------------
//選擇前一幀作爲背景(讀入第一幀時,第一幀作爲背景)
if(num==numFrames)
{
background=gray.clone();
frame_0=background;
}
else
{
background=frame_0;
}
//------------------------------------------------------------------------------------
absdiff(gray,background,foreground);//用幀差法求前景
imshow("foreground",foreground);
Mat element = getStructuringElement(MORPH_RECT,Size(5,5));
threshold( foreground, foreground_BW, 30, 255 , 0 );//二值化通常設置爲50 255
//threshold(foreground, foreground_BW, 0, 255 ,CV_THRESH_BINARY | CV_THRESH_OTSU) ; //此處使用大津法 自適應取閾值
imshow("foreground_BW",foreground_BW);
medianBlur(foreground_BW,mid_filer,3); //中值濾波法
imshow("mid_filer",mid_filer);
dilate(mid_filer,gray_dilate1,element);
imshow("gray_dilate1",gray_dilate1);
dilate(gray_dilate1,gray_dilate2,element);
imshow("gray_dilate2",gray_dilate2);
dilate(gray_dilate2,gray_dilate3,element);
imshow("gray_dilate3",gray_dilate3);
frame_0=gray.clone();
num--;
char c = waitKey(33);
if( c ==27 ) break;
if (num < 1)
return -1;
}
}
實驗結果如下:opencv:幀差法(c++版)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.