背景模型提取
前提假设 在背景模型提取阶段,运动目标在场景区域中运动,不会长时间停留在某一位置
视频流中某一像素点只有在前景运动目标通过时,它的亮度值才发生大的变化,在一段时间内,亮度值主要集中在很小的一个区域中,可以用这个区域内的平均值作为该点的背景值。具体实现过程:在YUV颜色空间下,Y值的变化范围为0~255,将该范围划分成若干区间[0,T][T,2T]…[Nt,255],n=255/T,对于每个像素点,统计一段时间内每个区间内亮度值的出现的次数。找出出现次数最多的那个区间,将该区间内所有值的平均值作为背景模型在该点的亮度值。这种方法不受前景运动目标的影响。
def get_background(total_frame_list,fps):
#初始化背景为第一帧
background=np.array(total_frame_list[0])
frames=int(2*fps)
frames_list=[]#缓存前L 帧视频图像
for i in range(frames):
frames_list.append(total_frame_list[i])
frames_list=np.array(frames_list)
# 对于每个像素点的每一个颜色通道,先统计滑窗时间里每个区间内颜色分量值在 L 帧视频图像中出现的次数,然后
# 计算出现次数最多的区间内所有值的平均值,并用它来作为背景模型在该点的颜色值
for i in range(frames_list.shape[1]): # 高
for j in range(frames_list.shape[2]): # 宽
for k in range(frames_list.shape[3]): # 通道
a = 0 # 0-51
b = 0 # 51-102
c = 0 # 102-153
d = 0 # 153-204
e = 0 # 204-255
a_count=0
b_count = 0
c_count = 0
d_count = 0
e_count = 0
for l in range(frames):
if frames_list[l ,i ,j ,k ] >= 0 and frames_list[l ,i ,j ,k ] < 51:
a_count += frames_list[l ,i ,j ,k]
a+=1
elif frames_list[l ,i ,j ,k ] >= 51 and frames_list[l ,i ,j ,k ] < 102:
b_count += frames_list[l, i, j, k]
b+=1
elif frames_list[l ,i ,j ,k ] >= 102 and frames_list[l ,i ,j ,k ] < 153:
c_count += frames_list[l, i, j, k]
c+=1
elif frames_list[l ,i ,j ,k ] >= 153 and frames_list[l ,i ,j ,k ] < 204:
d_count += frames_list[l, i, j, k]
d+=1
else :
e_count += frames_list[l, i, j, k]
e+=1
list=[a,b,c,d,e]
#print("height: ",i,"width: ",j,"tongdao: ",k," ",list)
#max_value = max(list) # 最大值
max_index = list.index(max(list)) # 返回最大值的索引
if max_index==0:
background[i, j, k] =int(a_count/a)
elif max_index==1:
background[i, j, k] = int(b_count / b)
elif max_index==2:
background[i, j, k] = int(c_count / c)
elif max_index==3:
background[i, j, k] = int(d_count / d)
else :
background[i, j, k] = int(e_count / e)
print("background.shape: ",background.shape)
# cv2.imshow("bg", background)
# cv2.waitKey()
# cv2.destroyAllWindows()
return background