网络上流行的ViBe算法的python实现版本运行速度非常慢,根本达不到实时的目的;而论文作者提供的C++版本则速度超快。借鉴一些网络上的说法改成numpy来操作速度更快,有些大佬也给出了新的思路。新的代码初始化速度有明显提升,记录于此。
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Oct 11 13:19:31 2019
升级版vibe(速度更快)
@author: youxinlin
"""
import numpy as np
import cv2
class ViBe:
'''
ViBe运动检测,分割背景和前景运动图像
'''
def __init__(self,num_sam=20,min_match=2,radiu=20,rand_sam=16):
self.defaultNbSamples = num_sam #每个像素的样本集数量,默认20个
self.defaultReqMatches = min_match #前景像素匹配数量,如果超过此值,则认为是背景像素
self.defaultRadius = radiu #匹配半径,即在该半径内则认为是匹配像素
self.defaultSubsamplingFactor = rand_sam #随机数因子,如果检测为背景,每个像素有1/defaultSubsamplingFactor几率更新样本集和领域样本集
self.background = 0
self.foreground = 255
def __buildNeighborArray(self,img):
'''
构建一副图像中每个像素的邻域数组
参数:输入灰度图像
返回值:每个像素9邻域数组,保存到self.samples中
'''
height,width=img.shape
self.samples=np.zeros((self.defaultNbSamples,height,width),dtype=np.uint8)
#生成随机偏移数组,用于计算随机选择的邻域坐标
ramoff_xy=np.random.randint(-1,2,size=(2,self.defaultNbS