OpenCV使用MOG和KNN實現視頻背景消除建模(背景差分)


一、概述

  案例:使用MOG和KNN實現視頻背景消除建模,使用OpenCV中的createBackgroundSubtractorMOG()和createBackgroundSubtractorKNN()來實現

  1.createBackgroundSubtractorMOG()參數介紹:

Ptr<BackgroundSubtractorMOG2>
    createBackgroundSubtractorMOG2(int history=500, double varThreshold=16,
                                   bool detectShadows=true);
history:用於訓練背景的幀數,默認幀數為500幀,如果不動手設置learingRate,history就被用於計算當前的learningRate, 此時history越大,learningRate越小,背景更新越慢
varThreshold:方差閾值,用於判斷當前像素是前景還是背景。一般默認為16,如果光照變化明顯,如陽光下的水面,建議設為25,值越大靈敏度越低。
deteShadows:是否檢測影子,設為true為檢測,false為不檢測,檢測影子會增加程序時間復雜度,一般設置為false


BackgroundSubstractorMOG2->apply(src, fmask, learningRate);
src:源圖像
fmask:差分圖像
learningRate:學習速率,值為0-1,為0時背景不更新,為1時逐幀更新,默認為-1,即算法自動更新;

  2.createBackgroundSubtractorKNN()參數介紹:

createBackgroundSubtractorKNN(int history=500, double dist2Threshold=400.0,
                                   bool detectShadows=true);
history:用於訓練背景的幀數,默認幀數為500幀,如果不動手設置learingRate,history就被用於計算當前的learningRate, 此時history越大,learningRate越小,背景更新越慢
dist2Threshold:方差閾值,用於判斷當前像素是前景還是背景。一般默認為400,值越大靈敏度越低。
detectShadows:是否檢測影子,設為true為檢測,false為不檢測,檢測影子會增加程序時間復雜度,一般設置為false

 BackgroundSubstractorMOG2->apply(src, fmask, learningRate);
 src:源圖像
 fmask:差分圖像
 learningRate:學習速率,值為0-1,為0時背景不更新,為1時逐幀更新,默認為-1,即算法自動更新;

  實現此算法的步驟:

  1.創建VideoCapture

  2.使用open方法打開視頻

  3.創建creteBackgroundSubtractorKNN()/createBackgrondSubtractorMOG()

  4.while循環讀取視頻數據

  5.在循環體內執行apply方法生成差分

  6.顯示差分圖像

  7.完成

二、代碼示例

1.MOG算法實現差分:

 VideoCapture capture;
    capture.open(filePath);
    if(!capture.isOpened()){
        qDebug()<<"無法打開視頻文件";
        return;
    }
    Mat frame;
    Mat bsMaskMOG;
    Ptr<BackgroundSubtractor> mogSub = createBackgroundSubtractorMOG2(100,25,false);
    Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
    while(capture.read(frame)){
        mogSub->apply(frame,bsMaskMOG);
        morphologyEx(bsMaskMOG,bsMaskMOG,MORPH_OPEN,kernel);//使用形態學操作消除白點
        imshow("mog",bsMaskMOG);
        waitKey(100);
    }
    capture.release();

2.KNN算法實現差分:

VideoCapture capture;
    capture.open(filePath);
    if(!capture.isOpened()){
        qDebug()<<"無法打開視頻文件";
        return;
    }
    Mat frame;
    Mat knnMask;
    Mat kernel = getStructuringElement(MORPH_RECT,Size(3,3));
    Ptr<BackgroundSubtractor> knnSub = createBackgroundSubtractorKNN();
    while(capture.read(frame)){
        knnSub->apply(frame,knnMask);
        morphologyEx(knnMask,knnMask,MORPH_OPEN,kernel);
        imshow("knn",knnMask);
        waitKey(100);
    }
    capture.release();

 

 

三、演示圖片

ps:圖片如何侵權請聯系我,我立馬刪除

 


免責聲明!

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



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