#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
文章來源: