[轉]-幀間差分法_OpenCV_詳解


一.基本概念

基於視頻的車輛檢測算法種類很多:光流法檢測,幀差法,背景消除法(其中包括:直方圖法,平均值法,單分布和混合高斯分布背景模型,Kalman濾波等),邊緣檢測法,運動矢量檢測法…下面分享的是運動目標檢測算法中最基本的方法—幀間差分法。

        相鄰幀間圖像差分思想:檢測出了相鄰兩幀圖像中發生變化的區域。該方法是用圖像序列中的連續兩幀圖像進行差分,然后二值化該灰度差分圖像來提取運動信息。由幀間變化區域檢測分割得到的圖像,區分出背景區域和運動車輛區域,進而提取要檢測的車輛目標。

        它是通過比較圖像序列中前后兩幀圖像對應像素點灰度值的不同,通過兩幀相減,如果灰度值很小,可以認為該點無運動物體經過;反之灰度變化很大,則認為有物體經過。第k幀和k+1幀圖像fk(x,y),fk+l(x,y)之間的變化用一個二值差分圖像D(x,y)表示,如式:

二值圖中0對應前后未變化的地方,1對應變化的地方。流程圖如下圖所示:

幀差法的特點是實現簡單,運算速度快,對於動態環境自適應性是很強的,對光線的變化不是十分的敏感。但是在運動體內易產生空洞.特別是目標運動速度較快時,影響目標區域准確提取。我們以年輛檢測為例,車輛檢測除了要檢測出運動車輛.同時還要檢測出暫時停止的車輛,在這個方面,此類方法無能為力。而且如果車輛的體積較大,那么車輛在前后幀中根容易產生重疊部分,尤其是大貨車,這使得幀問差分的結果主要為車頭和車尾。車輛中間部分的差分值相對報小.形成空洞,不利於檢測。

二.程序源代碼

 

  1.  
    #include “stdafx.h”
  2.  
    #include “highgui.h”
  3.  
    #include “cxcore.h”
  4.  
    #include “ml.h”
  5.  
    #include “cv.h”
  6.  
     
  7.  
    void main()
  8.  
    {
  9.  
    CvCapture* capture;
  10.  
    capture=cvCaptureFromFile( “video.avi”);//獲取視頻
  11.  
    cvNamedWindow( “camera”,CV_WINDOW_AUTOSIZE);
  12.  
    cvNamedWindow( “moving area”,CV_WINDOW_AUTOSIZE);
  13.  
     
  14.  
     
  15.  
    IplImage* tempFrame; //用於遍歷capture中的幀,通道數為3,需要轉化為單通道才可以處理
  16.  
    IplImage* currentFrame; //當前幀
  17.  
    IplImage* previousFrame; //上一幀
  18.  
    /*
  19.  
    CvMat結構,本質上和IplImage差不多,但是因為IplImage里的數據只能用uchar的形式存放,當需要這些圖像數據看作數據矩陣來運算時,0~255的精度顯然滿足不了要求;
  20.  
    然而CvMat里卻可以存放任意通道數、任意格式的數據
  21.  
    */
  22.  
    CvMat* tempFrameMat;
  23.  
    CvMat* currentFrameMat; //IplImage要轉成CvMat進行處理
  24.  
    CvMat* previousFrameMat;
  25.  
     
  26.  
    int frameNum=0;
  27.  
    while(tempFrame=cvQueryFrame(capture))
  28.  
    {
  29.  
    //tempFrame=cvQueryFrame(capture);
  30.  
    frameNum++;
  31.  
    if(frameNum==1)
  32.  
    {
  33.  
    //第一幀先初始化各個結構,為它們分配空間
  34.  
    previousFrame=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),IPL_DEPTH_8U, 1);
  35.  
    currentFrame=cvCreateImage(cvSize(tempFrame->width,tempFrame->height),IPL_DEPTH_8U, 1);
  36.  
    currentFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);
  37.  
    previousFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);
  38.  
    tempFrameMat=cvCreateMat(tempFrame->height, tempFrame->width, CV_32FC1);
  39.  
    //此時這些IplImage和CvMat都是空的,沒有存有數據
  40.  
    }
  41.  
    if(frameNum>=2)
  42.  
    {
  43.  
    cvCvtColor(tempFrame, currentFrame, CV_BGR2GRAY); //轉化為單通道灰度圖,此時currentFrame已經存了tempFrame的內容
  44.  
    /*
  45.  
    用cvConvert將IplImage轉為CvMat,接下來用cvAbsDiff對它們處理
  46.  
    經過轉換后,currentFrame沒有改變,但是tempFrameMat已經存了currentFrame的內容
  47.  
    */
  48.  
    cvConvert(currentFrame,tempFrameMat);
  49.  
    cvConvert(previousFrame,previousFrameMat);
  50.  
     
  51.  
    cvAbsDiff(tempFrameMat,previousFrameMat,currentFrameMat); //做差求絕對值
  52.  
    /*
  53.  
    在currentFrameMat中找大於20(閾值)的像素點,把currentFrame中對應的點設為255
  54.  
    此處閾值可以幫助把車輛的陰影消除掉
  55.  
    */
  56.  
    cvThreshold(currentFrameMat,currentFrame, 20,255.0,CV_THRESH_BINARY);
  57.  
    //cvConvert(currentFrameMat,currentFrame); //觀察不二值化的情況
  58.  
     
  59.  
    cvDilate(currentFrame,currentFrame); //膨脹
  60.  
    cvErode(currentFrame,currentFrame); //腐蝕
  61.  
    cvFlip(currentFrame, NULL, 0); //垂直翻轉
  62.  
    //顯示圖像
  63.  
    cvShowImage( “camera”,tempFrame);
  64.  
    cvShowImage( “moving area”,currentFrame);
  65.  
    }
  66.  
    //把當前幀保存作為下一次處理的前一幀
  67.  
    cvCvtColor(tempFrame, previousFrame, CV_BGR2GRAY);
  68.  
    cvWaitKey( 33);
  69.  
     
  70.  
    } //end while
  71.  
     
  72.  
    //釋放資源
  73.  
    cvReleaseImage(&tempFrame);
  74.  
    cvReleaseImage(&previousFrame);
  75.  
    cvReleaseImage(&currentFrame);
  76.  
     
  77.  
    cvReleaseCapture(&capture);
  78.  
    cvReleaseMat(&previousFrameMat);
  79.  
    cvReleaseMat(&currentFrameMat);
  80.  
    cvDestroyWindow( “camera”);
  81.  
    cvDestroyWindow( “moving area”);
  82.  
    }
  • 1


【注意】代碼復制他處,略有改動,進行視頻輸出矯正(源代碼昰倒的圖像)。 

轉載自:https://blog.csdn.net/tezhongjunxue/article/details/14492101


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM