运动检测多种多样,这里的需求只是检测到有运动物体就行了,而且

要尽量减少误报的情况。另外尽量降低CPU的消耗,因为最终需要在树莓派上面运行。

看了一些中文的文章,发现无法很好地理解别人说的内容,反而是外国人写的文章比较实在

这里的思路和代码来自一篇外文博客,原文来自:http://blog.cedric.ws/opencv-simple-motion-detection

这里博主使用了差值的办法来检测运动。也就是准备三幅图像,分布叫做prev, current 和next

这三幅图像是一个视频的前后三帧。

可以这样表示检测的过程:

  1. diff1 = prev - next
  2. diff2 = current - next
  3. result = diff1 & diff2

用opencv的语言来说,就是:

  1. absdiff(prev_frame, next_frame, d1);
  2. absdiff(current_frame, next_frame, d2);
  3. bitwise_and(d1, d2, result);

另外,最后还要加一个阈值,因为很细小的运动,比如窗帘被气流吹动的行为会造成一个误报的

现象,这里主要是需要检测大动作,比如一只小狗走来走去的现象。

  1. threshold(result, result, , , CV_THRESH_BINARY);

检测的结果如下:

可以说有初步成效了。

下面,可以在上图的白色区域放置一个矩形框(用opencv可以很轻松地做到)

这里博主贴出了代码:

  1. // loop over image and detect changes
  2. for(int j = y_start; j < y_stop; j+=){ // height
  3. for(int i = x_start; i < x_stop; i+=){ // width
  4. // check if at pixel (j,i) intensity is equal to 255
  5. // this means that the pixel is different in the sequence
  6. // of images (prev_frame, current_frame, next_frame)
  7. if(static_cast(motion.at<uchar>(j,i)) == )
  8. {
  9. number_of_changes++;
  10. if(min_x>i) min_x = i;
  11. if(max_x<i) max_x = i;
  12. if(min_y>j) min_y = j;
  13. if(max_y<j) max_y = j;
  14. }
  15. }
  16. }

从代码里面看,这里遍历了整一幅差值图像(也就是上面的result图),并且将所有为255亮度的

点统计起来,并且生成两个结果:

1.number of changes,也就是变化为100%的点的数量

2.max值和min值,用于在变化周围画矩形

这是画矩形的代码:

  1. if(number_of_changes){
  2. //check if not out of bounds
  3. if(min_x- > ) min_x -= ;
  4. if(min_y- > ) min_y -= ;
  5. if(max_x+ < result.cols-) max_x += ;
  6. if(max_y+ < result.rows-) max_y += ;
  7. // draw rectangle round the changed pixel
  8. Point x(min_x,min_y);
  9. Point y(max_x,max_y);
  10. Rect rect(x,y);
  11. Mat cropped = result(rect);
  12. cropped.copyTo(result_cropped);
  13. rectangle(result,rect,color,);
  14. }

这里的处理number of changes应该是判断大于某个值的时候再画,因为

可能出现误报。

优化

到这里为止,可以得到两个结论:

1.这个算法是比较简单的,也就是CPU消耗比较少。

2.这个算法存在着不足,也就是误报的问题。

因为这个算法要应用到树莓派中,所以特别复杂但是精准的办法就不可取。

上面的办法可以做两点优化,第一个是判断number of changes大于某个值的时候再画,

第二个是判断图像中出现移动物体时延迟一段时间后再判断,这样会减少误报。

  1. // If a lot of changes happened, we assume something changed.
  2. if(number_of_changes>=there_is_motion)
  3. {
  4. if(number_of_sequence>){
  5. saveImg(result,DIR,EXT,DIR_FORMAT.c_str(),FILE_FORMAT.c_str());
  6. saveImg(result_cropped,DIR,EXT,DIR_FORMAT.c_str(),CROPPED_FILE_FORMAT.c_str());
  7. }
  8. number_of_sequence++;
  9. }
  10. else
  11. {
  12. number_of_sequence = ;
  13. // Delay, wait a 1/2 second.
  14. cvWaitKey (DELAY);
  15. }

注意到,这里是检测到了物体再delay,而不是每次都delay。这样会保证整个检测系统的运行

质量。

另一个办法是通过标准差来检测先后的变化,当然这个办法会消耗额外的CPU,不过可以试试看

  1. // calculate the standard deviation
  2. Scalar mean, stddev;
  3. meanStdDev(motion, mean, stddev);
  4. // if not to much changes then the motion is real (neglect agressive snow, temporary sunlight)
  5. if(stddev[] < max_deviation)

最后博主给出了代码(github上也有):

https://github.com/cedricve/motion-detection/blob/master/motion_src/src/motion_detection.cpp

因为目前没有可用的摄像头,买到之后试试博主的代码并且更新博客。

Opencv实现运动检测的更多相关文章

  1. 1.0.x-学习Opencv与MFC混合编程之---视频运动检测

    源代码地址: http://download.csdn.net/detail/nuptboyzhb/3961668 版本1.0.x新增内容 视频运动检测 Ø 新建菜单项,Learning OpenCV ...

  2. OpenCV进阶之路:一个简化的视频摘要程序

    一.前言 视频摘要又称视频浓缩,是对视频内容的一个简单概括,先通过运动目标分析,提取运动目标,然后对各个目标的运动轨迹进行分析,将不同的目标拼接到一个共同的背景场景中,并将它们以某种方式进行组合.视频 ...

  3. opencv笔记6:角点检测

    time:2015年10月09日 星期五 23时11分58秒 # opencv笔记6:角点检测 update:从角点检测,学习图像的特征,这是后续图像跟踪.图像匹配的基础. 角点检测是什么鬼?前面一篇 ...

  4. 运动检测(前景检测)之(一)ViBe

    运动检测(前景检测)之(一)ViBe zouxy09@qq.com http://blog.csdn.net/zouxy09 因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新的方法和思 ...

  5. 运动检测(前景检测)之(二)混合高斯模型GMM

    运动检测(前景检测)之(二)混合高斯模型GMM zouxy09@qq.com http://blog.csdn.net/zouxy09 因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新 ...

  6. 学习OpenCV,看这些!

    OpenCV简介: OpenCV 是一款功能强大的跨平台计算机视觉开源库,可以用于解决人机交互.物体检测.人脸识别等领域的问题.库本身是采用 C++ 编写的,但是同时也对 Python, Java, ...

  7. OpenCV ——背景建模之CodeBook(2)

    1,CodeBook的来源 先考虑平均背景的建模方法.该方法是针对每一个像素,累积若干帧的像素值,然后计算平均值和方差,以此来建立背景模型,相当于模型的每一个像素含有两个特征值,这两个特征值只是单纯的 ...

  8. opencv 相关一个很好的博客

    http://blog.csdn.net/zouxy09/article/category/1218765 图像卷积与滤波的一些知识点 图像卷积与滤波的一些知识点zouxy09@qq.comhttp: ...

  9. OpenCV学习笔记二:OpenCV模块一览

    注:本系列博客基于OpenCV 2.9.0.0 一,一览图: 二,模块: /* 基础库 */ 1,opencv_core(链接) ,opencv最基础的库.包含exception,point,rect ...

随机推荐

  1. chrome和搜狗浏览器的js问题

    1.在chrome中如果是js添加颜色必须用"#00CC00",必须加#号...不然会出问题,但是在搜狗浏览器中可以没有#号也能正确识别...

  2. JS中的event 对象详解

    JS中的event 对象详解   JS的event对象 Event属性和方法:1. type:事件的类型,如onlick中的click:2. srcElement/target:事件源,就是发生事件的 ...

  3. jQuery Validate 表单验证插件----自定义校验结果样式

    一.下载依赖包 网盘下载:https://yunpan.cn/cryvgGGAQ3DSW  访问密码 f224 二.引入依赖包 <script src="../../scripts/j ...

  4. javascript将DOM事件处理程序封装为event.js 出现的低级错误记录

    将 DOM 0级事件处理程序和DOM2级事件处理程序 IE事件处理程序封装为eventUtil对象,达到跨浏览器的效果.代码如下: var eventUtil = { // 添加事件句柄 addEve ...

  5. TarJan 算法求解有向连通图强连通分量

    [有向图强连通分量] 在有向图G中,如果两个 顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的 ...

  6. Linux 下从头再走 GTK+-3.0 (六)

    在 GTK3 中增加了一个 GtkApplicaton 类,便于我们处理多窗口程序,同时有了 GtkApplication 我们也更容易创建灵活,易用,界面美观的应用程序. 在前面的几个例子中,演示了 ...

  7. SSH web.xml文件配置

    启动一个WEB项目的时候, WEB容器会去读取它的配置文件web.xml web.xml中配置的加载优先级:context-param -> listener -> filter -> ...

  8. NOIP2014提高组 DAY1 -SilverN

    T1  生活大爆炸版石头剪刀布 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头.如果两个人出拳一样,则不分胜负.在<生活大爆炸>第二季第8 集中出现了一种石头剪刀布的 ...

  9. shell script 学习笔记-----命令执行

    1.PATH变量:shell最主要的功能就是执行用户输入的命令,例如当用户输入一条“ls”命令之后,shell就要找到该命令对应的文件并执行.通常shell都会设置一个名叫PATH的环境变量,其中保存 ...

  10. 车脸检测 Adaboost 检测过程

    上一节中我介绍了如何使用Opencv自带的opencv_traincascade.exe来做训练,接下来介绍如何使用训练生成的cascade.xml模型文件来检测车脸. 首先需要说明的是我这里的训练数 ...