opencv:幀差法(c++版)

分類:編程 時間:2016-11-08
[摘要:#include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main (int argc, char** argv) { VideoCapture capture("2.avi"); if (!cap]



#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;
	}
}
實驗結果如下:


Tags: background include frame return camera

文章來源:


ads
ads

相關文章
ads

相關文章

ad