ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

OpenCV使用MOG和KNN实现视频背景消除建模(背景差分)

2022-04-18 22:02:38  阅读:319  来源: 互联网

标签:KNN capture 背景 差分 OpenCV learningRate apply MOG history


一、概述

  案例:使用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:图片如何侵权请联系我,我立马删除

 

标签:KNN,capture,背景,差分,OpenCV,learningRate,apply,MOG,history
来源: https://www.cnblogs.com/tony-yang-flutter/p/16163017.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有