一种基于帧差分算法的简易视频报警算法的设计与实现

目前帧差分算法常用在视频关键帧的提取工作中,那么笔者考虑该算法是否可以适用于无人值守站点场景下监控报警呢?当然前提是这类场景必须是静态的且只有异常情况才会出现动态物体闯入。本文通过opencv工具实现了帧差分算法,并用一段网络上的仓库监控视频进行模拟。

帧差分算法的原理很简单,我们知道将两帧图像进行差分,得到图像的平均像素强度可以用来衡量两帧图像的变化大小。因此,基于帧间差分的平均强度,每当视频中的某一帧与前一帧画面内容产生了大的变化,我们便认为它是关键帧,并将其提取出来。

因此利用该原理我们设计的算法的流程简述如下:

  • 计算差分强度:读取监控视频,并依次计算每两帧之间的帧间差分,进而得到平均帧间差分强度。
  • 关键帧提取:选择平均帧间差分强度高于预设阈值的帧作为视频的关键帧。
  • 报警记录:对关键帧及相邻视频段进行存储及报警。

计算帧差分部分python代码

 while(success):
    #用这个函数把图像从RGB转到BGR
        luv = cv2.cvtColor(frame, cv2.COLOR_BGR2LUV)
        curr_frame = luv
        if curr_frame is not None and prev_frame is not None:
            #logic here
    #比较两帧,获取差分图,就是将两幅图像作差
            diff = cv2.absdiff(curr_frame, prev_frame)
            diff_sum = np.sum(diff)
            diff_sum_mean = diff_sum / (diff.shape[0] * diff.shape[1])
            frame_diffs.append(diff_sum_mean)
    #构造Frame(id, diff)
            frame = Frame(i, diff_sum_mean)
            frames.append(frame)
        prev_frame = curr_frame
        i = i + 1
    #读取下一帧
        success, frame = cap.read()   

上图所示是网络上一段仓库的监控视频,该仓库不定时会有叉车经过,系统 通过帧间差分算法计算其各时段的差分强度。当差分强度大于6时说明有叉车经过(开头和结尾为爱剪辑的过场动画)。此外,该算法还适用于各类无人值守的场景监控。通过视频与差分强度图表对比,可以看出,有叉车经过时明显差分强度上升,进而截取差分强度比较高的时段视频作为关键帧/视频。

猜你喜欢

转载自blog.csdn.net/vic_torsun/article/details/86492559