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