前言:运动对象常用在视频监控领域,目的是从序列图像中将变化区域从背景图像中提取出来,运动区域的有效检测对目标分类、跟踪、行为理解等后期处理非常重要。根据摄像机与运动目标之间的关系可分为静态背景下的运动目标检(摄像机静止)和动态背景下的运动目标检测(摄像机也同时运动)。项目中我用到的是静态背景下的运动目标检测,需通过固定摄像机检测运动物体,并完成抓取动作。

内容:

  运动目标检测常用的方法一般分为两大类,一种是基于特征的方法,另一种是基于灰度的方法。基于特征的方法是依据图像的特征来检测运动目标,多用于目标较大、特征容易提取的场合。基于灰度的方法一般是依据图像中灰度的变化来检测运动目标。目前基于视频的检测方法主要有基于帧间差分的方法、基于光流场的方法、基于背景差的方法等。

  帧间差分法是基于运动图像序列中相邻两帧图像具有较强的相关性而提出的检测方法,具有很强的自适应性。但是如果物体灰度分布均匀,这种方法会造成目标重叠部分形成较大空洞,严重时造成目标分割不连通,从而检测不到目标。

  光流场法是基于对光流的估算进行检测分割的方法,光流中既包括被观察物体的运动信息,也包括有关的结构信息。光流场的不连续性可以用来将图像分割成对应于不同运动物体的区域。但多数光流法的计算复杂、耗时,难以满足实时监测的需求。

  背景差法是运动检测中最常用的一种方法,它将输入图像与背景图像进行比较,直接根据灰度变化等统计信息的变化来分割运动目标。差分法一般计算量小实用价值大,但受光线、天气等外界条件影响较大。其基本思想是将当前图像与背景相减,若像素差值大于某一阈值,则判断此像素为运动目标上的点。其最重要的一步就是背景建模,需要估计出一个不带有运动目标的背景模型,通过计算当前帧与该背景模型的差来确定运动目标的位置。

  项目中,我准备使用帧间差分法来实现运动目标检测。

  帧间差分法通过对序列图像中相邻帧做差分或相减运算,利用序列图像中相邻帧的强相关性做变化检测,从而检测出运动目标。它通过直接比较相邻帧对应像素点灰度值的不同,然后通过选取阈值来提取序列图像中的运动区域。在序列图像中,第k帧图像fk(x,y)和第k+1帧图像fk+1(x,y)之间的变化可用二值差分图像D(x,y)表示,如下:

  

  式中,T为差分图像二值化的阈值。二值图像中为“1”的部分由前后两帧对应像素灰度值发生变化的部分组成,通常包括运动目标和噪声;为“0”的部分由前后两帧对应像素灰度值不发生变化的部分组成。

  算法流程:读取视频文件->图像预处理(包括将彩色图像转换为灰度图像、滤波降噪--中值滤波)->帧间差分->运动目标检测(形态学滤波--膨胀、腐蚀)。

  具体实现:采用C#+Emgu完成,具体代码如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Windows;
 4 using System.Windows.Threading;
 5 using Emgu.CV;
 6 using Emgu.CV.Structure;
 7 using Emgu.CV.WPF;
 8 using Rectangle = System.Drawing.Rectangle;
 9
10 namespace ImageDetect_ATAW
11 {
12     /// <summary>
13     /// MainWindow.xaml 的交互逻辑
14     /// </summary>
15     public partial class MainWindow : Window
16     {
17         private Capture _capture;
18         private Image<Bgr, byte> _currentFrame;
19         private Image<Bgr, byte> _previousFrame;
20         private int Threshold = 40;
21         private DispatcherTimer _timer = new DispatcherTimer();
22         //private int[] _rectPosition = {130, 240, 120, 150};
23         public MainWindow()
24         {
25             InitializeComponent();
26             _capture = new Capture();
27         }
28
29         private void buttonOpen_Click(object sender, RoutedEventArgs e)
30         {
31             _capture.QueryFrame();
32             _previousFrame = _capture.QueryFrame();
33             _timer.Interval = new TimeSpan(0, 0, 0, 0, 40);
34             _timer.Tick += timer_Tick;
35             _timer.Start();
36         }
37
38         void timer_Tick(object sender, EventArgs e)
39         {
40             _currentFrame = _capture.QueryFrame().Clone();
41             var _currentFrameCopy = _currentFrame.Clone();
42             //_currentFrameCopy.Draw(new Rectangle(_rectPosition[0],_rectPosition[1],_rectPosition[2],_rectPosition[3]),new Bgr(0,0,255), 2);
43             imageBox1.Source = BitmapSourceConvert.ToBitmapSource(_currentFrameCopy);
44             FrameDiff(_previousFrame,_currentFrameCopy);
45         }
46
47         private void FrameDiff(Image<Bgr, byte> preFrame, Image<Bgr, byte> curFrame)
48         {
49             //var position = new int[4];
50             var curGrayImage = curFrame.Convert<Gray, byte>();
51             var preGrayImage = preFrame.Convert<Gray, byte>();
52             var diffImage = curGrayImage.AbsDiff(preGrayImage);
53             var imageB = diffImage.ThresholdBinary(new Gray(Threshold), new Gray(255));
54             var imageBin = imageB.Erode(2).Dilate(2);
55             var contour = imageBin.FindContours();
56             var list = new List<Rectangle>();
57
58             while (contour != null)
59             {
60                 if (contour.Area >150)
61                 {
62                     var xValue = contour.BoundingRectangle.X;
63                     var yValue = contour.BoundingRectangle.Y;
64                     var wValue = contour.BoundingRectangle.Width;
65                     var hValue = contour.BoundingRectangle.Height;
66
67                     list.Add(contour.BoundingRectangle);
68                     imageBin.Draw(new Rectangle(xValue,yValue,wValue,hValue),new Gray(255), 2);
69                 }
70                 contour = contour.HNext;
71             }
72             imageBox2.Source = BitmapSourceConvert.ToBitmapSource(imageBin);
73             _previousFrame = curFrame.Clone();
74             //return list.ToArray();
75         }
76
77         private void buttonClose_Click(object sender, RoutedEventArgs e)
78         {
79             _capture.Dispose();
80             _timer.Stop();
81         }
82
83
84     }
85 }

View Code

转载于:https://www.cnblogs.com/zoe-yan/p/4829265.html

静态背景下运动目标检测相关推荐

  1. 静态背景下运动目标检测 matlab_动态拉伸、静态拉伸你做对了么?

    ↑ 点击图片获得JOINFIT健身装备 ↑ "运动乃精神之砥柱,思想之动力!" -----马库斯·图留斯·西塞罗 拉伸对于很多肌友都不算陌生,人多人都喜欢在开始训练前做一些拉伸.但 ...

  2. 基于opencV的动态背景下运动目标检测及跟踪(修改版)

    基于openCV的动态背景下的运动目标检测 from: http://www.mianfeiwendang.com/doc/89c6692a222a84b2ced0d502/1 摘要:介绍在动态背景下 ...

  3. 【opencv】动态背景下运动目标检测 SURF配准差分

    主要思路是,读入视频,隔帧采用SURF计算匹配的特征点,进而计算两图的投影映射矩阵,做差分二值化,连通域检测,绘制目标. 如果背景是静态的采用camshift即可. 本文方法速度debug下大概2-3 ...

  4. 背景差分运动目标检测

    记录自己写的简单的背景差分目标检测(不知道是不是完整的步骤) 过程 1.第一帧作为背景帧(假定第一帧不含运动目标),并将其转换成灰度图像: clc;clear; I = VideoReader(&qu ...

  5. 针对无人机航拍视频中动态背景下的目标检测

    目录 目录 传统目标检测技术 传统目标检测技术 1. 帧间差分 通过连续两帧相同位置像素点间的灰度差来确定目标移动.但只适用于静态背景和目标单一条件的目标检测.仅适用于无人机悬停状态下的目标检测. 2 ...

  6. 基于高斯核密度估计的背景建模和改进的五帧帧差法相融合的运动目标检测算法

    上篇文章所指定的是对一个不包含动态背景的监控视频进行前景提取,用基于改进的五帧帧差和混合高斯模型相融合的前景提取算法是可以很好实现前景提取的.但本文中要求在包含动态背景的监控视频提取前景目标,虽然上篇 ...

  7. 运动目标检测ViBe算法

    一.运动目标检测简介   视频中的运动目标检测这一块现在的方法实在是太多了.运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测.先简单从视频中的背景类型来讨论. ...

  8. MATLAB运动目标检测系统

    1 绪论 1.1 课题研究背景及意义 运动目标检测是图像处理与计算机视觉的一个分支,在理论和实践上都有重大意义,长久以来一直被国内外学者所关注.在实际中,视频监控利用摄像机对某一特定区域进行监视,是一 ...

  9. MATLAB运动目标检测

    1 绪论 课题研究背景及意义 运动目标检测是图像处理与计算机视觉的一个分支,在理论和实践上都有重大意义, 长久以来一直被国内外学者所关注.在实际中,视频监控利用摄像机对某一特定区域进行 监视,是一个细 ...

最新文章

  1. 【c语言】蓝桥杯算法提高 3-2求存款
  2. H5前端框架推荐合集 (转)
  3. 抱歉咯!今天偷个懒!!
  4. 如何在Exchange中处理不能发送的信息
  5. Bailian2815 城堡问题【DFS】
  6. 日语+AI语音黑科技,早道开启小语种AI智能时代!
  7. Graylog日志管理系统---搜索查询方法使用简介
  8. HTTP Gzip压缩问题总结
  9. vmlinux vmlinuz zimage uimage 区别
  10. 基于Unity的阿里云短信SDK接入流程
  11. H5拖拽方法drag在VUE中的应用实例
  12. opencv Library QUIRC is not linked解决办法
  13. Django实现adminx后台网站访问的IP记录统计
  14. MindManager下载和使用
  15. 安卓开发常用软件及环境配置
  16. Java学习日记1——基础认知
  17. php detailview,PHP开发框架Yii Framework教程(31) Zii组件-DetailView示例
  18. 计算机机房年度重点工作,信息中心计算机的机房建设要求最新.doc
  19. Hive分析、窗口函数
  20. Robot Framework自动化测试解决selenium2library加载失败

热门文章

  1. linux获取触控板信息,关于linux:Linux-下通过命令行和脚本开关笔记本触控板和其他输入外设...
  2. 智能车牌识别停车场系统方案
  3. 服务器入门/tomcat以及如何部署
  4. java用axis方式调用webservice接口
  5. Android系统篇之—-Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)
  6. cartographer源码解析(二)node_main.cc文件详解
  7. stdin,stderr,stdout
  8. 计算机网络体系结构及其简单通信
  9. 2023MyBatis全新面试题【30题】
  10. 【巴迪亲子英语启蒙课堂】会日常单词,会简单对话,自主对话不行怎么办?是否要加强英文对话?