#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; }