Opencv幀差法

#define threshold_diff1 10 //設置簡單幀差法閾值
#define threshold_diff2 10 //設置簡單幀差法閾值
int main(int argc,unsigned char* argv[])
{	
   Mat img_src1,img_src2,img_src3;//3幀法須要3幀圖片
   Mat img_dst,gray1,gray2,gray3;
   Mat gray_diff1,gray_diff2;//存儲2次相減的圖片
   Mat gray;//用來顯示前景的
   bool pause=false;
   VideoCapture vido_file("1.flv");//在這裏改相應的文件名,輸入也能夠爲攝像頭設備  輸入形式爲 '0'
   namedWindow("foreground",0);
   for (;;)	
   {		
      if(!false)	
	{		
	  vido_file >>img_src1;	
        cvtColor(img_src1,gray1,CV_BGR2GRAY);	
	waitKey(5);		
	vido_file >>img_src2;	
	cvtColor(img_src2,gray2,CV_BGR2GRAY);	
	imshow("video_src",img_src2);//	
	waitKey(5);			
        vido_file >>img_src3;	
	cvtColor(img_src3,gray3,CV_BGR2GRAY);	
	subtract(gray2,gray1,gray_diff1);//第二幀減第一幀	
	subtract(gray3,gray2,gray_diff2);//第三幀減第二幀	
	for(int i=0;i<gray_diff1.rows;i++)		
	 for(int j=0;j<gray_diff1.cols;j++)	
	   {			
		if(abs(gray_diff1.at<unsigned char>(i,j))>=threshold_diff1)//這裏模板參數必定要用unsigned char,不然就一直報錯						
               gray_diff1.at<unsigned char>(i,j)=255;            //第一次相減閾值處理				else gray_diff1.at<unsigned char>(i,j)=0;					                if(abs(gray_diff2.at<unsigned char>(i,j))>=threshold_diff2)//第二次相減閾值處理			gray_diff2.at<unsigned char>(i,j)=255;	
		else gray_diff2.at<unsigned char>(i,j)=0;	
	}				
        bitwise_and(gray_diff1,gray_diff2,gray);	
	}	
	char c=(char)waitKey(10);
		if (c==27)	
	{		
	break;    	
	}		
       if(c== ' ')	
		pause=!pause;
	}	
return 0;
}
相關文章
相關標籤/搜索