OpenCV帧差法实现方法

opencv2.3.1里的以下函数可计算当前帧与背景之差的绝对值。

cv::absdiff(backgroundImage,currentImage,foreground);


如果摄像机是固定的,那么我们可以认为场景(背景)大多数情况下是不变的,而只有前景(被跟踪的目标)会运动,这样就可以建立背景模型。通过比较当前帧和背景模型,就能轻松地跟踪目标运动情况了。这里,最容易想到的比较方式就是当前帧减去背景模型了

代码如下:

[cpp]  view plain  copy
  1. using namespace std;  
  2. using namespace cv;  
  3.   
  4. int main(int argc,char * argv())  
  5. {  
  6.     //读入视频  
  7.     //VideoCapture capture("CarLights2.avi");  
  8.     VideoCapture capture(0);  
  9.     //namedWindow("camera",WINDOW_AUTOSIZE);  
  10.     //namedWindow("moving area",WINDOW_AUTOSIZE);  
  11.     Mat tempframe, currentframe, previousframe;  
  12.     Mat frame;  
  13.     int framenum = 0;  
  14.         //读取一帧处理  
  15.     while (true)  
  16.     {  
  17.         if(!capture.isOpened())  
  18.         {  
  19.             cout << "read video failure" << endl;  
  20.             return - 1;  
  21.         }  
  22.         //tempframe = capture.read(frame);  
  23.   
  24.   
  25.         capture >> frame;  
  26.         tempframe = frame;  
  27.         framenum++;   
  28.         if (framenum == 1)  
  29.         {  
  30.             cvtColor(tempframe, previousframe, CV_BGR2GRAY);  
  31.         }  
  32.         if (framenum >= 2)  
  33.         {  
  34.             Mat currentframe1,currentframe2, currentframe3, currentframe4;  
  35.             cvtColor(tempframe, currentframe, CV_BGR2GRAY);//转化为单通道灰度图,此时currentFrame已经存了tempFrame的内容   
  36.             absdiff(currentframe,previousframe,currentframe);//做差求绝对值    
  37.             threshold(currentframe, currentframe, 20, 255.0, CV_THRESH_BINARY);  
  38.             dilate(currentframe, currentframe,Mat());//膨胀  
  39.             erode(currentframe, currentframe,Mat());//腐蚀  
  40.   
  41.             //显示图像    
  42.             imshow("camera", tempframe);  
  43.             imshow("moving area", currentframe);  
  44.   
  45.         }  
  46.         //把当前帧保存作为下一次处理的前一帧    
  47.         //cvtColor(tempframe, previousframe, CV_BGR2GRAY);  
  48.         waitKey(33);  
  49.     }//end while    
  50. }  

你可能感兴趣的:(OpenCV)