网络上流行的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.defaultNbSamples,height,width))
#ramoff_x=np.random.randint(-1,2,size=(self.defaultNbSamples,2,height,width))
#xr_=np.zeros((height,width))
xr_=np.tile(np.arange

针对ViBe算法Python实现的效率问题,本文介绍了如何通过使用numpy库进行优化,以提高初始化速度,实现更接近实时的效果。分享了从C++版本汲取灵感并结合社区智慧的改进方案。
最低0.47元/天 解锁文章
3600

被折叠的 条评论
为什么被折叠?



