微信公众号:一个优秀的废人
如有问题或建议,请公众号留言

前言

这是我大学舍友小钊在前几天培训公司内部人员顺便记录的一篇关于帧差法移动侦测的文章,介绍下小钊,广西佬,我的大学舍友,特点是烟勤话少爱抠脚。是一名计算机视觉工程师,主要专注于桑拿沐足(啊?呸!)、将算法应用到嵌入式设备上,实现低成本的落地方案注册 。

当我们要把一幅图像中的运动区域和静止区域区分开的时候,这样的任务在计算机视觉中称为前后景分离,而帧差法则是前后景分离中最简单的一种方法,单纯考虑像素值在空间上的变化而不考虑时间特性。
对于两帧帧差法的计算过程可以用一句话描述:对于某个像素,如果它在前后两幅图像中的差值的绝对值超过某个设定好的阈值,则认为它属于前景,否则认为它属于背景。
具体的 Python 代码如下,使用了numpy和opencv:

'''
函数名: frame_diff
输入:
img1    int类型的灰度图
img2    int类型的灰度图
thresh  帧差阈值
输出:   前景为白色,背景为黑色的掩码图
'''
def frame_diff(img1, img2, thresh):height, width = img1.shape[:2] # 获取宽高mask = np.zeros((height, width), dtype=np.uint8) # 返回的掩码图# 遍历图像for i in xrange(height):for j in xrange(width):if abs(img1[i,j] - img2[i,j]) > thresh: # 差的绝对值大于阈值mask[i,j] = 255else:mask[i,j] = 0return mask

设定阈值为50,对两幅实例图像处理的结果如下:


理想情况下,我们得到的掩码图应该是中间挡住 lena 的一整块全白,这是因为有些像素点差值依然小于阈值,造成了一些“空洞”,在实际应用中会带来问题,但也只能用如膨胀之类的方法减小这些空洞。
即使存在需要人为设定阈值和会造成空洞这样的问题,也不能阻止我们用它来做一些应用。比如在你家安置这样一个摄像头,在你离开的这段时间,如果检测到一大片移动区域(掩码图中白色的像素值占全图的比例很高),那么就可以触发一些异常报警。其实很多市场上的智能摄像头的移动侦测功能就是这么做的。
其实帧差法在我个人的工作中更多是一个预处理的手段,比如我会对掩码图中的各个连通区域做最大外接矩形把这些区域都单独标记出来,再对每个矩形区域做其他的处理,比如判断它是不是个人。
最后,其实上面写的代码很不 Python,只是为了解释清原理写的,真正的写法应该这样:

def frame_diff2(img1, img2, thresh):mask = np.zeros(img1.shape, dtype=np.uint8) # 返回的掩码图mask[np.abs(img1 - img2) > thresh] = 255return mask

最后奉上完整代码:

# coding: utf-8
import os, sys
import cv2
import numpy as np'''
函数名: frame_diff
输入:
img1    int类型的灰度图
img2    int类型的灰度图
thresh  帧差阈值
输出:   前景为白色,背景为黑色的掩码图
'''
def frame_diff(img1, img2, thresh):height, width = img1.shape[:2] # 获取宽高mask = np.zeros((height, width), dtype=np.uint8) # 返回的掩码图# 遍历图像for i in xrange(height):for j in xrange(width):if abs(img1[i,j] - img2[i,j]) > thresh: # 差的绝对值大于阈值mask[i,j] = 255else:mask[i,j] = 0return maskdef frame_diff2(img1, img2, thresh):mask = np.zeros(img1.shape, dtype=np.uint8) # 返回的掩码图mask[np.abs(img1 - img2) > thresh] = 255return mask# 程序入口
def main():# 读图img1 = cv2.imread('lena.jpg', 0)img2 = cv2.imread('lena_tmpl.jpg', 0)img1_int = img1.astype(np.int32)img2_int = img2.astype(np.int32)# 帧差法获取掩码图mask = frame_diff2(img1_int, img2_int, 50)# 显示cv2.imshow('img1', img1)cv2.imshow('img2', img2)cv2.imshow('mask', mask)cv2.imwrite('img1.jpg', img1)cv2.imwrite('img2.jpg', img2)cv2.imwrite('mask.jpg', mask)cv2.waitKey(0)if __name__ == '__main__':main()

后语

今天就说到这里,小钊平时工作 996 非常忙(人家高薪哇,酸溜溜),以下奉上我的公众号二维码,对 Python 、算法有兴趣的可以关注一下。我会不定时邀请小钊 抠脚大汉 嵌入一下计算机视觉方面的知识,如果你想撩小钊也可以加他微信:qq584688538,可以躺下慢慢培养感情。

最后发个通告,因原「 海花打印店」公号拥有者,也就是小钊无暇维护公众号,以后所有技术、非技术的文章都将都由我这个优秀的废人来继续维护。恰逢毕业季,最后放上一张我们大学时经营的打印店的公号,纪念一下属于我们的青春:毕业了,从海花打印店转移过来。

PS:昨天高考放榜,马上就要填志愿了,我也帮不了你们什么大忙,我只知道广东海洋大学牛逼
PPS:祝愿在校的毕业快乐,工作的搬砖快乐,在校的朋友,我们在工地等你们。

「 计算机视觉」帧差法移动侦测相关推荐

  1. python识别重影验证码_python+opencv实现移动侦测(帧差法)

    本文实例为大家分享了python+opencv实现移动侦测的具体代码,供大家参考,具体内容如下 1.帧差法原理 移动侦测即是根据视频每帧或者几帧之间像素的差异,对差异值设置阈值,筛选大于阈值的像素点, ...

  2. opencv进阶-背景建模-(帧差法与混合高斯模型)

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

  3. Python实现视频运动目标检测——帧差法

    Python实现视频运动目标检测--帧差法 在许多场景中,我们需要对视频中的运动目标进行检测.而在这个过程中,帧差法是一种常用的方法.本文将详细阐述Python如何利用帧差法实现视频运动目标检测. 首 ...

  4. 相邻帧差法和三帧差法

    相邻帧差法和三帧差法 原文地址:https://blog.csdn.net/dcrmg/article/details/52234929 帧间差分法是通过对视频中相邻两帧图像做差分运算来标记运动物体的 ...

  5. 图片区域帧差法识别物体_matlab

    PS:今天上午,非常郁闷,有很多简略基础的问题搞得我有些迷茫,哎,代码几天不写就忘.目前又不当COO,还是得用心记代码哦! 当初又到了本科生结业的时候,很多学同都在写毕设了.想想客岁帮我的女神做了 个 ...

  6. 利用python语言实现帧差法,python+opencv实现帧差法

    实验效果如下图: 需要的可以下载代码文件直接就可以运行看看效果哦. 帧差法实现运动目标检测

  7. 前景检测算法(三)--帧差法

     原文:http://www.cnblogs.com/tornadomeet/archive/2012/05/01/2477629.html 前景检测算法_2(帧差法1) 帧差法是背景减图法中的一 ...

  8. 目标检测、追踪梳理:帧差法、光流法、背景减除法

    (0)总览 运动目标检测是指在序列图像中检测出变化区域并将运动目标从背景图像(背景层)中提取出来.通常情况下,目标分类.跟踪和行为理解等后处理过程仅仅考虑图像中对应于运动目标的像素区域(前景层),因此 ...

  9. 运动目标检测之帧差法

    原理简介: 所谓帧差法也就是对连续图像帧做差分运算,其结果与定义好的阈值比较,若大于阈值则为运动目标值为1,否则值为0 . 帧差法一般分为两帧差分和三帧差分. 两帧差分: 取连续的两帧序列,用后一帧减 ...

  10. ​基于matlab的目标检测 背景差分法和帧差法

    本程序实现了图像传感器的叶子抖动研究系统,利用背景差分.帧差法实现了此系统. 结果如下: 点击帧差法,显示如下: 部分程序见: gui_Singleton = 1; gui_State = struc ...

最新文章

  1. js中的DOM对象和jQuery对象的比较
  2. Kubernetes天生对多云策略的支持
  3. 【每日SQL打卡】​​​​​​​​​​​​​​​DAY 3丨删除重复的电子邮箱【难度简单】
  4. IOS 定义手势监听器详解,利用 UIGestureRecognizer 进行捏合、旋转、平移、点击、长按手势事件响应
  5. 结合内存分析java归并排序_排序算法之归并排序(Mergesort)解析
  6. 机器视觉LCD行业质量检测解决方案
  7. 虚拟机里ubuntu扩容主分区/dev/sda1
  8. svn st 的状态说明
  9. Windows下sqlmap安装方法
  10. SIM900A更改波特率
  11. 51单片机的音乐盒设计
  12. php 设置针式打印机纸张,针式打印机设置方法 针式打印机打印连续纸设置技巧【图文】...
  13. 三国鼎立企查查、天眼查、微猫的三国大战
  14. Prematurely reached end of stream
  15. Go官方的使用Gin开发Web服务教程 | Gopher Daily (2021.08.19) ʕ◔ϖ◔ʔ
  16. 关于mysql安装时无法正常启动0xc000007b的问题
  17. 基于Java毕业设计在校大学生健康状况信息管理系统源码+系统+mysql+lw文档+部署软件
  18. 【数理统计】F检验与单因素方差分析
  19. 百度地图集成(一):百度地图简单实现
  20. 新近开发了一款Android应用奶爸指南

热门文章

  1. 基于S3c2440的多种显示屏测试方案
  2. 循环冗余校验码(CRC码)
  3. 现代密码学常用符号总结
  4. 谷歌生物医学专用翻译_一款好用的文献英中翻译软件
  5. 3DMAX贴图材质免费网站
  6. CSS字体样式属性调试
  7. MATLAB 粒子群算法,例题与常用模版
  8. 一种基于RABC的软件系统权限管理设计
  9. ThinkPad T61 X61安装XP系统的方法及xp驅動下載
  10. 微信小程序获取手机号