運動檢測ViBe演算法python實現

2021-07-14 07:57:06 字數 3252 閱讀 4362

由於最近在做一些跟蹤檢查的研究,就用到了vibe演算法,根據網上的c++版本編寫了這個python版的演算法,在這分享給大家。

class vibe:

'''classdocs

'''__defaultnbsamples = 20 #每個畫素點的樣本個數

__defaultreqmatches = 2 #min指數

__defaultradius = 20; #sqthere半徑

__defaultsubsamplingfactor = 16#子取樣概率

__bg = 0 #背景畫素

__fg = 255 #前景畫素

__c_xoff=[-1,0,1,-1,1,-1,0,1,0] #x的鄰居點 len=9

__c_yoff=[-1,0,1,-1,1,-1,0,1,0] #y的鄰居點 len=9

__samples= #儲存每個畫素點的樣本值,len defaultnbsamples+1

__height = 0

__width = 0

def __init__(self, grayframe):

'''constructor

'''self.__height = grayframe.shape[0]

self.__width = grayframe.shape[1]

for i in range(self.__defaultnbsamples+1):

self.__samples.insert(i,np.zeros((grayframe.shape[0],grayframe.shape[1]),dtype=grayframe.dtype));

self.__init_params(grayframe)

def __init_params(self,grayframe):

#記錄隨機生成的 行(r) 和 列(c)

rand=0

r=0c=0

#對每個畫素樣本進行初始化

for y in range(self.__height):

for x in range(self.__width):

for k in range(self.__defaultnbsamples):

#隨機獲取畫素樣本值

rand=random.randint(0,8)

r=y+self.__c_yoff[rand]

if r<0:

r=0if r>=self.__height:

r=self.__height-1 #行

c=x+self.__c_xoff[rand]

if c<0:

c=0

if c>=self.__width:

c=self.__width-1 #列

#儲存畫素樣本值

self.__samples[k][y,x] = grayframe[r,c]

self.__samples[self.__defaultnbsamples][y,x] = 0

def update(self,grayframe,frameno):

foreground = np.zeros((self.__height,self.__width),dtype=np.uint8)

for y in range(self.__height): #height

for x in range(self.__width): #width

#用於判斷乙個點是否是背景點,index記錄已比較的樣本個數,count表示匹配的樣本個數

count=0;index=0;

dist=0.0;

while (count=self.__defaultreqmatches:

#判斷為背景畫素,只有背景點才能被用來傳播和更新儲存樣本值

self.__samples[self.__defaultnbsamples][y,x]=0

foreground[y,x] = self.__bg

rand=random.randint(0,self.__defaultsubsamplingfactor)

if rand==0:

rand=random.randint(0,self.__defaultnbsamples)

self.__samples[rand][y,x]=grayframe[y,x]

rand=random.randint(0,self.__defaultsubsamplingfactor)

if rand==0:

rand=random.randint(0,8)

yn=y+self.__c_yoff[rand]

if yn<0: yn=0

if yn>=self.__height: yn=self.__height-1

rand=random.randint(0,8)

xn=x+self.__c_xoff[rand]

if xn<0: xn=0

if xn>=self.__width: xn=self.__width-1

rand=random.randint(0,self.__defaultnbsamples)

self.__samples[rand][yn,xn]=grayframe[y,x]

else:

#判斷為前景畫素

foreground[y,x] = self.__fg;

self.__samples[self.__defaultnbsamples][y,x] += 1

if self.__samples[self.__defaultnbsamples][y,x]>50:

rand=random.randint(0,self.__defaultnbsamples)

if rand==0:

rand=random.randint(0,self.__defaultnbsamples)

self.__samples[rand][y,x]=grayframe[y,x]

return foreground

我做的魚的跟蹤效果圖

OpenCV 物體運動檢測

安裝各種環境 學習背景分割 二值化 膨脹 腐蝕等操作。原始碼 usr bin env python 汽車運動檢測 p140 import cv2 import os import numpy as np cap cv2.videocapture 1 cap cv2.videocapture 0 調取...

VIBE檢測演算法

一 vibe 獲取目標 其他演算法處理 最終目標 優點 記憶體占用少,處理速度快,計算量小,檢測效果好 無引數法 可直接應用在產品中,軟硬體相容性好 效能優於混合高斯,引數化方法,sacon等 背景模型及時初始化 具有較好的抗噪能力。缺點 ghost區域 挑戰 必須適應環境的變化 比如光照的變化造成...

混合高斯運動檢測筆記

include include include include opencv2 video background segm.hpp include opencv2 legacy blobtrack.hpp include opencv2 legacy legacy.hpp include openc...