vibe是一个又简单又牛逼的算法,没有什么数学公式,就只有三步

1.初始化背景模型,总共有20个背景模型样本,每个样本中的每个点由其八邻域初始化(论文里面没有用到自己这个像素点,看了其他的改进,有用自己的,这个没必要较真,大家都是试出来的,不一定适合每个场景)。

2.前景背景判定 新来的每一帧与背景模型做比较,如果新的帧的点与背景模型中样本的点的像素值大小不超过20(20是个经验值

在网上搜了一下,实现的版本,emm,速度真的是太慢了,慢的想要哭,but自己要用啊,这个速度真的是不能接受的,那怎么办呢,只好优化一下,虽然自己也是菜鸡,只能简单的搞一搞了。

添加了动态阈值与后处理,有效的减少了误检。

感觉后处理是万能的,可以过滤掉好多东西

参考的代码

通过profile分析了一下,瓶颈主要是在随机数生成上,所以,要减少随机数生成的次数。然后就是for循环慢,能改就尽量改成numpy。

def bg_update(I_gray,seg_mask,samples, sub_factor, fg_mask_counts):

height, width = seg_mask.shape

x_y_set = [[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]

neighbor_num = len(x_y_set)

for i in range(height):

for j in range(width):

if not seg_mask[i,j]:

fg_mask_counts[i, j] = 0

r = np.random.randint(0, sub_factor)

if r == 0:

r = np.random.randint(0, sample_num)

samples[i, j, r] = I_gray[i, j]

r = np.random.randint(0, sub_factor)

if r == 0:

# x, y = random.choice(x_y_set)

rnd = np.random.randint(0, neighbor_num)

r = np.random.randint(0, sample_num)

ri = i + x_y_set[rnd][0]

rj = j + x_y_set[rnd][1]

try:

if not seg_mask[ri, rj]:

samples[ri, rj, r] = I_gray[i, j]

except:

pass

else:

fg_mask_counts[i, j] += 1

if fg_mask_counts[i, j] > 200:

r = np.random.randint(0, sub_factor)

if r == 0:

r = np.random.randint(0, sample_num)

samples[i, j, r] = I_gray[i, j]

return samples, fg_mask_counts

def get_segmap(I_gray, samples, _min, sample_num, radius):

height = I_gray.shape[0]

width = I_gray.shape[1]

distance = np.zeros((height, width, sample_num)).astype(np.int8)

for i in range(sample_num):

distance[:, :, i] = I_gray - samples[:, :, i]

distance = np.abs(distance)

'''动态阈值'''

mean_distance = np.average(distance, axis=-1).astype(np.uint8)

#radius_adp= np.where((5 * mean_distance)

radius_adp = np.where((5 * mean_distance) < radius, radius-0.5*mean_distance, radius + 0.2*mean_distance)

radius_adp = np.repeat(radius_adp[:,:,np.newaxis],sample_num,axis=2)

counts = np.sum(distance

'''动态阈值end'''

'''固定阈值'''

# counts = np.sum(distance < radius, axis=-1)

'''固定阈值end'''

segmap = np.where(counts>=_min, 0, 255).astype(np.uint8)

segmap = pos_process(segmap)

return segmap

def initial_background(I_gray, sample_num):

height = I_gray.shape[0]

width = I_gray.shape[1]

samples = np.zeros((height, width, sample_num))

fg_mask = np.zeros((height, width))

#3邻域

x_y_set =[[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]]

#5邻域

# x_y_set = [[-2, -2], [-2, -1], [-2, 0], [-2, 1], [-2, 2], [-1, -2], [-1, -1], [-1, 0], [-1, 1], [-1, 2], [0, -2], [0, -1], [0, 0], [0, 1], [0, 2], [1, -2], [1, -1], [1, 0], [1, 1], [1, 2], [2, -2], [2, -1], [2, 0], [2, 1], [2, 2]] neighbor_num = len(x_y_set)

for i in range(height):

for j in range(width):

for n in range(sample_num):

rnd = np.random.randint(0, neighbor_num)

ri = i + x_y_set[rnd][0]

rj = j + x_y_set[rnd][1]

if ri< 0:

ri = 0

if ri >= height:

ri = height-1

if rj < 0:

rj = 0

if rj >= width:

rj = width-1 #

# x, y = random.choice(x_y_set) # ri = i + x # rj = j + y samples[i, j, n] = I_gray[ri, rj]

return samples, fg_mask

后处理才是万能的,怎么去处理缝隙啊,还有阴影啊。虽然文章挺老的,但是效果好啊。

最后就是Python真的是蜗牛,和c++比的话,所以,要是对时间有要求的话,还是转投c++的怀抱吧。一个想哭的我,不说话。

python实现算法改进_运动目标检测vibe算法及其改进Python实现相关推荐

  1. 运动目标检测ViBe算法

    一.运动目标检测简介   视频中的运动目标检测这一块现在的方法实在是太多了.运动目标检测的算法依照目标与摄像机之间的关系可以分为静态背景下运动检测和动态背景下运动检测.先简单从视频中的背景类型来讨论. ...

  2. 运动目标检测ViBe算法的numpy实现

    ViBe算法是一种优秀的运动目标检测,其背景建模是基于像素的邻域来建立,算法的具体原理我就不介绍了,网上可以搜到一大堆.网上提供的实现方法多是遍历图像中每个像素建立背景模型,有用c/c++实现的,也有 ...

  3. 运动目标检测ViBe算法的armadillo实现

    接上篇,最近在学习c++矩阵库,顺便把vibe算法用c++矩阵库armadillo做了一遍.虽然效果不理想,但是借这个机会算是把armadillo.Eigen.numcpp等几个注明的矩阵库都大致学习 ...

  4. 【XLPNet车牌识别算法】第二章 检测部分-算法篇1

    [XLPNet车牌识别算法]第二章 检测部分-算法篇1 1. XLPNet检测算法前言 2. XLPNet检测算法详解 2.1 起源 2.2 算法细节 2.1 算法命名 2.2 数据集 2.3 预备知 ...

  5. python图像差分法目标检测_运动目标检测(2)—帧间差分法

    帧差法依据的原则是:当视频中存在移动物体的时候,相邻帧(或相邻三帧)之间在灰度上会有差别,求取两帧图像灰度差的绝对值,则静止的物体在差值图像上表现出来全是0,而移动物体特别是移动物体的轮廓处由于存在灰 ...

  6. opencv-视频处理-实时的前景检测-Vibe算法

    vibe算法是一种像素级的前景检测算法,实时性高,内存占有率低,前景检测准确率高.但是会出现"鬼影",当然基于对鬼影的处理,也会有相应的对vibe算法的改进. 把下面三篇文章看明白 ...

  7. 【Python】监控视频中运动目标检测的代码实现及效果展示

    0.介绍 基于python,使用opencv库函数,实现监控视频中的运动目标检测,Mark一下! 干扰性和灵敏度的权衡,可通过调节代码中的参数(高斯模糊核.面积阈值.帧差间隔等)进行设置. 1.代码 ...

  8. python路径规划算法可视化_基于粒子群算法的牙齿正畸路径规划方法python实现

    这篇是基于粒子群算法的牙齿正畸路径规划研究的python实现,参考的是徐晓强等人的<基于改进粒子群算法的牙齿正畸路径规划方法>,与这篇文章的区别在于: 1.徐等的文章设计了一种改进的粒子群 ...

  9. python牛顿法计算平方根_常用的平方根算法详解与实现

    本文从属于笔者的数据结构与算法系列文章. SquareRoot 平方根计算一直是计算系统的常用算法,本文列举出几张简单易懂的平方根算法讲解与实现.其中Java版本的代码参考这里 Reference B ...

  10. python 进程生命周期_计算客户生命周期价值的python解决方案

    python 进程生命周期 By Lisa Cohen, Zhining Deng, Shijing Fang, and Ron Sielinski 由丽莎·科恩,志宁邓,石井方和罗恩Sielinsk ...

最新文章

  1. Java面试题及答案整理(2022最新版) 持续更新
  2. 两个列表之间移动数据
  3. DevExpress的LookUpEdit怎样不显示列名
  4. Cisco2960交换机密码忘记恢复教程
  5. ASP.NET 动态加载WebService功能
  6. windows 开启/关闭本地连接的批处理程序
  7. win10+Vmware14+Centeros7.6 mini网络设置
  8. c++ mysql 导入sql_mysql导入sql文件命令和mysql远程登陆使用详解
  9. NSCharacterSet 简单用法
  10. Shuffle Cards(Rope大法)将一段区间的数字整体搬动
  11. AndroidUI的基本结构
  12. Elasticsearch中的嵌套查询介绍及实例
  13. xp系统steam无法连接到更新服务器,xp系统打不开steam提示“无法链接至steam网络”的处理办法...
  14. Hexo个人免费博客(二) 创建主界面分页签和新博客
  15. Bytom储蓄分红合约解析
  16. python语言例子_第一个Python实例
  17. Unity中使用QQ邮箱发送验证码
  18. CentOS联网(图解超详细)
  19. 腾讯QQ,msn,百度Hi,淘宝的用户链接及网页在线客服代码
  20. java计算机毕业设计建筑劳务监管平台源码+mysql数据库+系统+lw文档+部署

热门文章

  1. 系泊系统悬链线matlab,基 于 悬 链 线 理 论 的 系 泊 系 统 势 能
  2. java学生管理系统论文_(定稿)毕业论文基于java的学生信息管理系统设计报告(完整版)最新版...
  3. 数据库连接池c3p0
  4. 跑腿 php,啦啦外卖跑腿小程序配置详情
  5. 淘淘商城简介——淘淘商城(一)
  6. Ubuntu18.04下WizNote为知笔记源码编译安装
  7. ,PLCSIM、SIMIT、Amesim、NX MCD、 Process Simulate、Plant Simulation,一文带你了解西门子整个虚拟调试与仿真软硬件体系
  8. 力软敏捷开发框架源码7.0.6旗舰版 JNPF开发平台3.3.3 3.4.1企业版/旗舰版框架
  9. Oracle 批量修改字段长度
  10. 《统计学习方法》python代码资料