OpenCV使用MOG和KNN实现视频背景消除建模(背景差分)
2022/4/18 23:12:46
本文主要是介绍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:图片如何侵权请联系我,我立马删除
这篇关于OpenCV使用MOG和KNN实现视频背景消除建模(背景差分)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-15PingCAP 黄东旭参与 CCF 秀湖会议,共探开源教育未来
- 2024-05-13PingCAP 戴涛:构建面向未来的金融核心系统
- 2024-05-09flutter3.x_macos桌面os实战
- 2024-05-09Rust中的并发性:Sync 和 Send Traits
- 2024-05-08使用Ollama和OpenWebUI在CPU上玩转Meta Llama3-8B
- 2024-05-08完工标准(DoD)与验收条件(AC)究竟有什么不同?
- 2024-05-084万 star 的 NocoDB 在 sealos 上一键起,轻松把数据库编程智能表格
- 2024-05-08Mac 版Stable Diffusion WebUI的安装
- 2024-05-08解锁CodeGeeX智能问答中3项独有的隐藏技能
- 2024-05-08RAG算法优化+新增代码仓库支持,CodeGeeX的@repo功能效果提升