#开始时间 2021年1月27日 早上
#结束时间 2021年1月30日
放假
#再次开始时间2021年3月7日 早上
先开始吐槽吧! 每个人都会说视频的异常定义是复杂的,有的情况下时正常的有的情况下是异常的,MD我就觉得不是,你摄像机是固定的,那个场景自己不会设置啊,S13 。设置好了场景不就固定了!!
20号考完试,今天是27号,经历了醉生梦死的一周,每天都是在玩玩,吃饭喝酒拍片,感觉生活节奏全部都打乱了。现在今天终于良心发现回学校读读论文。之前的那个综述信息量太大了。现在找个具体的方法,对整个实验的流程做整体性的了解。今天读的这篇文章是《[2016 信号处理] 梯度直方图和光流特征融合的视频图像异常行为检测算法_柳晶晶》,主要提出了光流法和梯度直方图两个信息特征融合的特征提取方法,我现在还不知道这两种的具体操作方式小声逼逼 。下面整理下在这篇文章存在的一些有用的信息。
一些视频处理方式
1 背景减除法(visual background Extractor)
2009 年由Barnich 等提出的视频背景提取算法( Visual Background Extractor,ViBe) 是一种像素级的背景算法,它采用了随机的更新策略,背景减除的速度快。虽然还没有看这个算法的具体想法,但是应该和帧差法差不多,就是将几帧视频中不变的部分去除,只保存变化的部分。
在csdn上看到一篇博客总结的不错,引用以下[背景提取算法——帧间差分法、背景差分法、ViBe算法、ViBe+算法] 参考
1.1 帧间差分法
一种通过对视频图像序列中相邻两帧作差分运算获得运动目标轮廓的方法。一般要经过滤波等处理,去噪处理。
原理:利用相邻两帧的相关性,以前一帧图像作为当前的背景图像(背景帧),然后将当前帧图像与背景图像进行差值运算,从而检测目标。
优点:速度快、适用于实时性较高的场合,且对环境整体光照变化不明感。
缺点:会出现空洞。当运动目标的色彩分布比较均匀时,且在前后两帖中,运动目标所在位置的差别在目标运动方向两侧,内部却没有什么变化,这样通过帖差法会漏检目标内部的像素点,导致运动目标有空洞出现。所W顿间差分法经常和其他检测方法联合使用提高检测效果。
参考文章【目标追踪】python帧差法原理及其实现
将两个视频帧取出 将其进行灰度化处理,然后将两帧数据相减,这样我们就得到了一个差值的帧,这样视频帧中静止的物体就会被去除 只保留前后两帧的差异部分。这样就可以得到运动物体的边缘。然后进行二值化操作,将相减后的差异帧,进行归一化操作,只有0和255 两个值。这样就会得到如下变化:
当然,也可能存在树叶的抖动,就会导致一些噪点。中值滤波 取像素的中间值,这样可以消除一些噪点,让运动的物体更加平滑。然后在进行一些形态学的操作腐蚀、膨胀、开运算、闭运算。
下面使用python 并导入cv2 包进行实现:
# open_camera.py
import cv2
import time
def catch_video(name='video', video_index=0):
#读取本地视频
cap = cv2.VideoCapture('C:/Users/\Lenovo/Desktop/180.avi')
# 使用摄像头读取数据
# cap = cv2.VideoCapture(video_index) # 创建摄像头识别类
if not cap.isOpened():
# 如果没有检测到摄像头,报错 或者本地视频未发现
raise Exception('Check if the camera is on.')
first_frame=True #由于第一帧是没法进行差值的,所以设置一个标志位
previous=None # 定义记录上一帧信息的变量
while cap.isOpened():
catch, frame = cap.read() # 读取每一帧图片
# ————————————————————————————————
# 处理图片
if first_frame:
previous=cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 初始化上一帧数据
first_frame=False
continue
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 将视频帧进行灰度处理
gray_diff = cv2.absdiff(gray, previous) # 计算绝对值差
# previous 是上一帧图片的灰度图
# cv2.imshow(name,gray) # 显示灰度帧
_, mask = cv2.threshold(gray_diff, 28, 255, cv2.THRESH_BINARY)# 定义一个阈值进行2值化 只有白色和黑色像素
#
median = cv2.medianBlur(mask, 3) # 中值滤波 取像素的中间值,这样可以消除一些噪点
##以下是进行形态学的操作 比如处理之腐蚀、膨胀、开运算、闭运算
es = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (1,1))
# 矩形:MORPH_RECT;交叉形:MORPH_CROSS;椭圆形:MORPH_ELLIPSE;第二和第三个参数分别是内核的尺寸以及锚点的位置。
# 一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值:
# 对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心点。element形状唯一依赖锚点位置,其他情况下,锚点只是影响了形态学运算结果的偏移。
m = cv2.erode(median, es, iterations=3) # 腐蚀
mask = cv2.dilate(m, es, iterations=3) # 膨胀
# k_size:中值滤波的滤波器大小
# iteration:腐蚀+膨胀的次数
# 形态学操作结束
cv2.imshow(name+"_orginal", frame) # 在window上显示原始帧 只有命名不同的情况下才会显示两个
cv2.imshow(name, mask) # 在window上显示帧
# ————————————————————————————————
previous=gray
key = cv2.waitKey(0)
# cv2.waitkey(delay),delay 的单位为ms毫秒,当 delay 取大于0的值时,程序在给定的 delay 时间内等待用户按键触发,如果用户没有按下键,则继续等待下一个delay时间(循环),直到用户按键触发,退出程序。若设置delay为0,则表示必须点击窗口界面的×才能关闭程序。
# 若设置delay的值小于0,等待键盘按键,任何一个按键都会关闭程序,默认参数为小于0。
# 不带参数表示,从键盘输入任何字符,都会关闭打开的窗口
if key & 0xFF == ord('q'):#将q转化为16进制
# 按q退出
break
if cv2.getWindowProperty(name, cv2.WND_PROP_AUTOSIZE) < 1:
# 点x退出
break
# 释放摄像头
cap.release()
cv2.destroyAllWindows()
if __name__ == "__main__":
catch_video()
1.2背景差分法
参考文章背景差分法
##过去了一个多月,我又重新捡起了这个论文,假期在家一点都没有看,果然惰性无处不在!刚刚洗完衣服,下面开始爆肝,然后下午还有点事【准备和朋友去干视频,昨天新入手的稳定器】,所以说一定要把中午这段时间的效率提高起来。##
背景差分法的主要思想是先建立一个背景模型,然后将以后的帧都和这个背景做差值,与帧间差方法的区别是后者用前一帧做背景,是一个迭代的过程,而前者使用建立的背景模型作为背景。
背景减除可以分为4个过程,即预处理、背景建模、前景检测、后处理。
首先是预处理,将图像进行灰度化和滤波。
##灰度化可以用opencv中的函数实现,目前还不知道滤波又什么意义?参考博文中加了一个canny算法求边缘,不懂为啥要求边缘。
懂了!canny求边缘,就是求取图像中的特征,但是现实中,有摄像机获取的图像,往往都存在噪声,而且信号并不存在理想的阶跃畸变,这样如果依然直接采用拉普拉斯算子进行灰度跃变检测,那样会产生很多的虚假特征点。因此,往往在图像处理之前,需要对灰度图进行滤波处理。以上就是滤波的作用,去到一些噪声点##
高斯滤波和ps中的高斯模糊很像,就是将一个像素点中间的值模拟为周围几个点的平均值,这样的图像就没那么锐了,也就是更平滑了。
参考这一篇博文
【图像处理基础知识】-混合高斯背景建模 ## 从函数方向分析了为啥高斯有用
混合高斯背景建模理解##介绍了一些优势,混合高斯背景建模是如何处理复杂内容问题
背景建模
背景建模的方法很多,如平均法,最大值最小值统计法,单高斯建模法,加权平均法等,而混合高斯背景建模应该来说是比较成功的一种。
混合高斯背景建模的优点
图像画面中,其实每个像素(也可以说是局部单元),其运动变化特性是不一样的,这才是混合高斯模型具有优势的主要原因。普通的二值化目标分割,整个画面采用同一阈值,无论这个阈值是固定的,还是自适应的,都存在本质性的缺陷,属于有缺陷的分割,这种算法带有不稳定性,无论怎么调整分割参数,也解决不了根本性的问题。因为,画面中每个部分,其实分割阈值是不一样的。一定得建立统计学的方法,进行局部分割,而混合高斯模型正是采用局部分割的一种算法。
下面研究下混合高斯背景建模方法
##搞了一段时间,并没有结果,所以准备放一放!
存档时间:2021/03/08/17:17
存档开始:
下面开始尝试下用代码实现!分析,如果只用第一帧作为背景,总会有第一帧的残影
红色就是第一帧的残影,绿色为新出现的,因此,不能只用第一帧作为背影,下面尝试求几帧的平均值。
存档结束
下面回到论文,
还有一个光流法之前没有考虑过,今天也把他搞定
光流(optical flow)是空间运动物体在观察成像平面上的像素运动的瞬时速度。
通常将二维图像平面特定坐标点上的灰度瞬时变化率定义为光流矢量。
下面分析以下这两个定义,现在的理解,显示物体的运动可以抽象为光线的运动,就是转化为正片叠底或者负片格式。然后画面中就只有黑白两个颜色也就是0 和255 两个值。这样物体的运动就可以描述为黑色或者白色的运动。就像光在流动,以上内容是我自己的理解,读者不可以轻信。
对于光流矢量的定义可以理解为某一个像素的灰度值的变化快慢,如果变化比较慢,便是物体运动是速度很慢!只是现在的理解。以后可能会被推翻!
突然想到! 对于一些系列图片,前景运动一定比背景快,那么在光流矢量中,运动的物体和背景会有明显的差异,难倒这就是光流的秘密吗!已经使用cv2实现了,