基于opencv的BackgroundSubtractorMOG2目标追踪

BackgroundSubtractorMOG2是以高斯混合模型为基础的背景/前景分割算法。它是以2004年和2006年Z.Zivkovic的两篇文章为基础的。这个算法的一个特点是它为每一个像素选择一个合适数目的高斯分布。(上一个方法中我们使用是K高斯分布)。这样就会对由于亮度等发生变化引起的场景变化产生更好的适应。和前面一样我们需要创建一个背景对象。但在这里我们我们可以选择是否检测阴影。如果detectShadows = True(默认值),它就会检测并将影子标记出来,但是这样做会降低处理速度。影子会被标记为灰色。

这里我们采用opencv实现视频追踪,对于opencv的安装、配置和使用,网上有很多教程,我们这里就不在说明。如果你对opencv不太了解,请自行查资料学习。话归正题,这里我将会分别从Python和c++实现BackgroundSubtractorMOG2,我使用的是opencv3.1linux版本。
Python代码:

import numpy as np
import cv2
import time
import datetimecap = cv2.VideoCapture(0)kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(3,3))
fgbg = cv2.createBackgroundSubtractorMOG2()
fourcc = cv2.VideoWriter_fourcc(*'XVID')
frame1 = np.zeros((640,480))
out = cv2.VideoWriter(datetime.datetime.now().strftime("%A_%d_%B_%Y_%I_%M_%S%p")+'.avi',fourcc, 5.0, np.shape(frame1))while(1):ret, frame = cap.read()fgmask = fgbg.apply(frame)(_,cnts, _) = cv2.findContours(fgmask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)maxArea = 0for c in cnts:Area = cv2.contourArea(c)if Area < maxArea :#if cv2.contourArea(c) < 500:(x, y, w, h) = (0,0,0,0)continueelse:if Area < 1000:(x, y, w, h) = (0,0,0,0)continueelse:maxArea = Aream=c(x, y, w, h) = cv2.boundingRect(m)cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)out.write(frame)cv2.imshow('frame',frame)k = cv2.waitKey(30)&0xffif k==27:break
out.release()
cap.release()
cv2.destoryAllWindows()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

c++版本:
VideoDetect.h

#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>using namespace std;
using namespace cv;
enum VIDEOTYPE
{CAMERAVIDEO/*摄像头*/,FILEVIDEO/*视频*/
};class MOG2Detector
{
public:MOG2Detector();~MOG2Detector();/*VIDEOTYPE 指定摄像头或者文件path 文件路径WindowName opencv可视化窗口名称*/MOG2Detector(VIDEOTYPE type,char * path = "E:/image/s.avi",char * WindowName = "Video");//开始void startDecect();private:char * WinName;VIDEOTYPE VideoType;cv::VideoCapture capture;cv::Ptr<cv::BackgroundSubtractorMOG2> fgbg;
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

VideoDetect.cpp:

#include "stdafx.h"
#include "MOG2Detector.h"MOG2Detector::MOG2Detector()
{
}
MOG2Detector::~MOG2Detector()
{}MOG2Detector::MOG2Detector(VIDEOTYPE type, char * path, char * WindowName)
{if (type == CAMERAVIDEO) {capture.open(0);}else if (type == FILEVIDEO){capture.open("E:/image/s.avi");}else {cout << "Type is error, you can input CAMERAVIDEO or FILEVIDEO" << endl;return;}if (!capture.isOpened()){std::cout << "video camera capture open fail! \n" << std::endl;exit(1);}fgbg = cv::createBackgroundSubtractorMOG2();WinName = WindowName;
}void MOG2Detector::startDecect()
{cv::Mat frame, fgmask;//cnts存储边缘信息std::vector<std::vector<cv::Point> > cnts;cv::namedWindow("video", 1);while (1){capture.read(frame);fgbg->apply(frame, fgmask);//检测每一帧边缘findContours(fgmask, cnts, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);float Area;Rect rect;vector<Point> m;for (int i = cnts.size() - 1; i >= 0; i--){vector<Point> c = cnts[i];//获取面积Area = contourArea(c);if (Area < 50)//50这个值根据需求设定,这里指的是目标的大小{continue;}else{m = c;}rect = boundingRect(m);rectangle(frame, rect, Scalar(0, 255, 0), 2);}resize(frame, frame, Size(480, 320));imshow("video", frame);char c = waitKey(33);if (c == 27)break;}//释放资源capture.release();cv::destroyWindow("video");
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80

最近比较忙,等到有时间在完善这些代码,添加注释!

基于opencv的BackgroundSubtractorMOG2目标追踪相关推荐

  1. python机器识别追踪_多目标追踪器:用OpenCV实现多目标追踪(C++/Python)

    原标题:多目标追踪器:用OpenCV实现多目标追踪(C++/Python) MultiTracker : Multiple Object Tracking using OpenCV (C++/Pyth ...

  2. Opencv之多目标追踪(基于Dlib库)

    Dlib介绍 Dlib是一个包含机器学习算法的C++开源工具包.Dlib可以帮助您创建很多复杂的机器学习方面的软件来帮助解决实际问题.目前Dlib已经被广泛的用在行业和学术领域,包括机器人,嵌入式设备 ...

  3. 目标跟踪(1)基于OpenCV实现单目标跟踪

    在本教程中,我们将学习使用OpenCV跟踪对象.OpenCV 3.0开始引入跟踪API.我们将学习如何和何时使用OpenCV 4.2中可用的8种不同的跟踪器- BOOSTING, MIL, KCF, ...

  4. 基于OpenCV的行人目标检测

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  5. 动手学无人驾驶(3):基于激光雷达3D多目标追踪

    上一篇博客介绍了无人驾驶中的车辆检测算法(YOLO模型),该检测是基于图像进行的2D目标检测.在无人驾驶环境感知传感器中还有另一种重要的传感器:激光雷达.今天就介绍一篇无人驾驶中基于激光雷达目标检测的 ...

  6. python opencv模板匹配多目标_基于opencv的多目标模板匹配

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #includ ...

  7. 基于opencv的BackgroundSubtractorMOG2和BackgroundSubtractorKNN通过背景减除来实现目标追踪

    背景减除(Background Subtraction)是许多基于计算机视觉的任务中的主要预处理步骤.如果我们有完整的静止的背景帧,那么我们可以通过帧差法来计算像素差从而获取到前景对象.但是在大多数情 ...

  8. 基于Opencv+Mediapipe实现手势追踪

    有关介绍 OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效- ...

  9. 论文学习-卫星视频与目标追踪-1-融合KCF跟踪器和三帧差算法

    论文学习-卫星视频与目标追踪-1 大家好,近来一直在研究基于视频卫星的目标追踪领域.为了更好地梳理自己的论文学习过程,故采用博客的方式记录下来.接下来我会将此领域一些我觉得典型的有意义的论文,以我自己 ...

最新文章

  1. 自动化运维工具Ansible
  2. 站立会议报告(12)
  3. 用Windows Live Writer发布博客也可以不生成缩略图
  4. centos7 nat模式配置静态ip_Manjaro 配置静态网络IP
  5. SQL终极优化(包括很多非索引方面的优化和原理)
  6. 注解默认继承_默认方法和多重继承
  7. 更改mysql数据库存放位置_更改mysql数据库存放位置
  8. php new static,PHP 的 new static 和 new self
  9. 销售联系客户 需要技巧
  10. 水经注万能地图下载器功能大全
  11. Linux进程间通信(上)
  12. 怎么用计算机算拔模斜度,拔模斜度怎么标注【带斜度CAD图形的标注方法详细步骤】...
  13. Biological Pathways 生物途径(通路)
  14. Bootstrap实战 - 单页面网站
  15. emWin移植时遇到的红蓝反色问题解决
  16. 批量清除Word中代码注释
  17. 2022版本的idea没有定位图标
  18. 华硕梅林固件成功安装astrill后,点进去一片空白
  19. 包分配并不是个好制度
  20. 虚拟中安装CentOS7系统

热门文章

  1. mysql修改编码格式6_修改编码格式MySQL
  2. 一个通用的任务管理模型-golang
  3. GPU深度发掘(一)::GPGPU数学基础教程
  4. mysql注入ctf_CTF SQL注入
  5. MYSQL中如何查看表结构命令_mysql查看表结构命令
  6. 计算机word做课程表实验报告,word制作课程表.doc
  7. linux shell脚本 判断,Shell脚本中的逻辑判断
  8. mysql 全局变量_详细讲解mysql全局变量与局部变量
  9. 分页场景(limit, offset)为什么会慢?
  10. 科普:Flume是啥?干嘛用的?