「 计算机视觉」帧差法移动侦测

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

当我们要把一幅图像中的运动区域和静止区域区分开的时候,这样的任务在计算机视觉中称为前后景分离,而帧差法则是前后景分离中最简单的一种方法,单纯考虑像素值在空间上的变化而不考虑时间特性。


对于两帧帧差法的计算过程可以用一句话描述:对于某个像素,如果它在前后两幅图像中的差值的绝对值超过某个设定好的阈值,则认为它属于前景,否则认为它属于背景。

具体的 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] = 255
            else:
                mask[i,j] = 0
    return mask


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


640.jpg


640.jpg

640.jpg


理想情况下,我们得到的掩码图应该是中间挡住 lena 的一整块全白,这是因为有些像素点差值依然小于阈值,造成了一些“空洞”,在实际应用中会带来问题,但也只能用如膨胀之类的方法减小这些空洞。


即使存在需要人为设定阈值和会造成空洞这样的问题,也不能阻止我们用它来做一些应用。比如在你家安置这样一个摄像头,在你离开的这段时间,如果检测到一大片移动区域(掩码图中白色的像素值占全图的比例很高),那么就可以触发一些异常报警。其实很多市场上的智能摄像头的移动侦测功能就是这么做的。


其实帧差法在我个人的工作中更多是一个预处理的手段,比如我会对掩码图中的各个连通区域做最大外接矩形把这些区域都单独标记出来,再对每个矩形区域做其他的处理,比如判断它是不是个人。


最后,其实上面写的代码很不 Python,只是为了解释清原理写的,真正的写法应该这样:


def frame_diff2(img1, img2, thresh):
    mask = np.zeros(img1.shape, dtype=np.uint8) # 返回的掩码图
    mask[np.abs(img1 - img2) > thresh] = 255
    return 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] = 255
            else:
                mask[i,j] = 0
    return mask
def frame_diff2(img1, img2, thresh):
    mask = np.zeros(img1.shape, dtype=np.uint8) # 返回的掩码图
    mask[np.abs(img1 - img2) > thresh] = 255
    return 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 、算法有兴趣的可以关注一下。


相关文章
|
6月前
|
机器学习/深度学习 算法 安全
基于图像识别的面瘫检测技术
基于图像识别的面瘫检测技术
112 0
|
3月前
|
机器学习/深度学习 文字识别 算法
LabVIEW图像识别的技术手段是什么?
LabVIEW在图像识别领域采用了多种技术手段,以实现对图像的采集、处理、分析和识别。
43 3
|
2月前
|
人工智能 C++ 计算机视觉
AI计算机视觉笔记四:行人属性识别
本文分享了一个行人属性分析系统,能够识别并标注行人的多种属性。该项目代码源自公众号“渡码”的项目,作者在Win10环境下成功复现了整个项目,并详细记录了过程。系统通过YOLOv5识别行人,用ByteTrack跟踪同一行人,并训练一个多标签图像分类网络来识别行人的26种属性。文中详细介绍了环境搭建和测试步骤,包括安装Anaconda、创建虚拟环境、安装所需库以及测试代码等。如需完整代码或有任何问题,请联系博主。源码已上传至GitHub。
|
3月前
|
机器学习/深度学习 人工智能 数据处理
AI计算机视觉笔记一:YOLOV5疲劳驾驶行为检测
如何使用云服务器AutoDL进行深度学习模型的训练,特别是针对YOLOV5疲劳驾驶行为训练检测
|
4月前
|
机器学习/深度学习 文字识别 算法
LabVIEW图像识别的技术手段有什么?
LabVIEW图像识别的技术手段有什么?
31 3
|
6月前
|
机器学习/深度学习 自动驾驶 算法
【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)
【计算机视觉+自动驾驶】二、多任务深度学习网络并联式、级联式构建详细讲解(图像解释 超详细必看)
280 1
|
11月前
|
计算机视觉
计算机视觉:驾驶员疲劳检测(一)
计算机视觉:驾驶员疲劳检测
149 0
|
11月前
|
计算机视觉
计算机视觉:驾驶员疲劳检测(二)
计算机视觉:驾驶员疲劳检测(二)
215 0
|
机器学习/深度学习 存储 算法
基于深度学习的车道检测
基于深度学习的车道检测
|
机器学习/深度学习 人工智能 算法
【语音识别】基于VQ特定人孤立词语音识别附matlab代码
【语音识别】基于VQ特定人孤立词语音识别附matlab代码
下一篇
无影云桌面