一、概述
案例:使用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:圖片如何侵權請聯系我,我立馬刪除

