步驟1:接受邊界框座標並計算質心
步驟2:計算新邊界框與現有物件之間的歐幾里得距離
步驟3:更新(x,y) -現有物件的座標
步驟4:註冊新物件
步驟5:登出舊物件
初始化下乙個唯一的物件id和兩個有序的用於跟蹤對映給定物件的字典 id到它的質心和它擁有的連續幀數分別被標記為「消失」
儲存給定的最大連續幀數物件被標記為「消失」,直到我們需要登出跟蹤物件,centroidtracker為質心***
# import the necessary packages
from scipy.spatial import distance as dist
from collections import ordereddict
import numpy as np
class centroidtracker():
self.nextobjectid = 0
self.objects = ordereddict()
註冊物件時,我們使用下乙個可用的物件id儲存質心。register為註冊新物件的方法。
def register(self, centroid):登出乙個物件id,我們刪除物件id和我們各自的字典 ,deregister登出物件的方法self.objects[self.nextobjectid] = centroid
self.nextobjectid += 1
def deregister(self, objectid):
del self.objects[objectid]
update方法可以使用多種物件檢測器比如haar級聯,hog +線性svm,ssd,faster r-cnn等。**功能依次包括檢查輸入邊框是否為矩形是空的、迴圈所有已存在的跟蹤物件並標記它們一樣消失了、如果我們已經達到最大連續數指定物件被標記為的幀失蹤,登出它、返回早,因為沒有質心或跟蹤資訊更新。
def update(self, rects):始化numpy陣列以儲存每個的質心:if len(rects) == 0:
self.deregister(objectid)
return self.objects
inputcentroids = np.zeros((len(rects), 2), dtype="int")
for (i, (startx, starty, endx, endy)) in enumerate(rects):
cx = int((startx + endx) / 2.0)
cy = int((starty + endy) / 2.0)
inputcentroids[i] = (cx, cy)
如果當前沒有要跟蹤的物件,我們將註冊每個新物件,
if len(self.objects) == 0:
for i in range(0, len(inputcentroids)):
self.register(inputcentroids[i])
否則,我們需要根據質心位置更新任何現有的物件(x,y)座標,以最小化它們之間的歐幾里得距離,are正在跟蹤物件,所以我們需要嘗試將輸入的質心與現有物件匹配重心,然後獲取一組物件id和相應的質心,計算每一對物件之間的距離centroids和輸入centroids,分別——我們的目標是將輸入質心與現有質心匹配物體質心。為了執行這個匹配,我們必須(1)找到每一行的最小值,然後(2)排序行索引基於它們的最小值,以便行的最小值位於索引的*front*處列表,接下來,我們對列執行類似的處理找出每一列中最小的值,然後使用先前計算的行索引列表進行排序。
else:
objectids = list(self.objects.keys())
objectcentroids = list(self.objects.values())
d = dist.cdist(np.array(objectcentroids), inputcentroids)
rows = d.min(axis=1).argsort()
cols = d.argmin(axis=1)[rows]
根據距離來檢視是否可以關聯物件id,在這段**中為了確定我們是否需要更新、註冊、或登出需要跟蹤的物件我們已經檢查過的行和列索引的,迴圈(行,列)索引的組合元組,如果我們已經檢查了行或列值前面,忽略它。否則,獲取當前行的物件id,設定它的新質心,並重置消失的,表示我們已經檢查了每一行和列索引。
usedrows = set()
usedcols = set()
for (row, col) in zip(rows, cols):
if row in usedrows or col in usedcols:
continue
objectid = objectids[row]
self.objects[objectid] = inputcentroids[col]
usedrows.add(row)
usedcols.add(col)
在我們的索引中可能有 使用的行
+ 用過的顏色
我們尚未檢查,計算我們還沒有的行和列索引。
unusedrows = set(range(0, d.shape[0])).difference(usedrows)
unusedcols = set(range(0, d.shape[1])).difference(usedcols)
因此,我們必須確定尚未檢查的質心索引,並將它們儲存在兩個新的列表中方便集中。
我們的最終檢查將處理丟失的或可能已消失的所有物件,在物件質心的數量為的情況下等於或大於輸入質心的數目我們需要檢查這些物件是否有可能消失了。迴圈遍歷未使用的行索引,獲取對應行的物件id
索引和增加消失的計數器,檢查是否有連續的數字物體被標記為「消失」取消物件註冊的權證。
if d.shape[0] >= d.shape[1]:
for row in unusedrows:
objectid = objectids[row]
self.deregister(objectid)
否則,輸入質心的數量大於現有物件質心的數量,因此我們要註冊和跟蹤新物件,返回可跟蹤物件的集合,我們迴圈
未使用的顏色索引,然後註冊每個新質心。最後,我們將可跟蹤物件的集合返回給呼叫方法。
質心***程式編寫完成!
計算機視覺跟蹤演算法 L1 tracker
l1 tracker的主要思想是用第一幀和最近幾幀得到的影象 特徵 作為字典,然後加上許許多多個trivial templates,也就是一幅影象中只有乙個白色畫素點,其他的都是黑色。這樣,將新得到的粒子濾波的candidate影象,利用l1最小二乘準則投影到這一組字典上。如果是前幾個templat...
(計算機視覺)計算機視覺基礎
opencv cximage cimg freeimage opencv中vc庫的版本與visual studio版本的對應關係 vc8 2005 vc9 2008 vc10 2010 vc11 2012 vc12 2013 vc14 2015 vc15 2017 visual studio中的輔助...
計算機視覺CV 之 CMT跟蹤演算法分析二
這裡先說明一下,作者關於cmt演算法寫了兩篇文章 consensus based matching and tracking of keypoints for object tracking wacv2014 best reward clustering of static adaptive cor...