基于Mean-shift算法跟蹤對象
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達

跟蹤對象是計算機視覺領域的重要應用。這在監(jiān)控系統(tǒng)、國防、自動駕駛汽車等方面都有用例。在本文中,我們將討論一種稱為均值漂移算法的基本跟蹤算法,并將通過在視頻中跟蹤汽車來了解其應用。
在進入均值漂移跟蹤之前,讓我們了解直方圖及其應用,以創(chuàng)建均值漂移跟蹤的預處理輸入。圖像由不同值的像素組成。像素的分布是每幅圖像的一個重要特征。直方圖對于通過計算每個像素的值數(shù)量來表征圖像內(nèi)容非常有用。要為圖像生成直方圖,我們可以使用 opencv 庫。以下代碼片段將為給定圖像創(chuàng)建直方圖。
img = cv2.imread(‘image.jpg’)color = {'b','g','r'}for i,col in enumerate(color):hist = cv2.calcHist([img],[i],None,[256],[0,256])
上面的代碼將為每個通道創(chuàng)建一個直方圖。
如果我們想檢測一個特定的物體或區(qū)域,那個位置的像素值將是一個重要的特征。因為它與不同的對象不同。例如,狗和汽車的像素值會不同。
某個區(qū)域的直方圖可以看作是一個函數(shù),它給出了一個特定像素屬于某個對象的概率。通過對獲得的圖像直方圖進行歸一化,我們可以得到給定強度值屬于我們感興趣區(qū)域的概率。獲得直方圖后,我們可以將其反投影到我們想要測試對象是否存在的任何圖像上。
在反向投影的情況下,我們用我們?yōu)楦信d趣的對象計算的歸一化直方圖的相應概率值替換輸入圖像的每個像素值。與感興趣區(qū)域相似的位置的強度值比不相似的區(qū)域具有更高的概率值。簡而言之,我們可以說反投影表示我們的測試圖像包含參考圖像對象的概率。
Mean-shift 是我們將用來跟蹤視頻中對象的算法??紤]一個區(qū)域中的一組點,如下所示。

初始窗口顯示為名稱為 C1 的藍色圓圈。現(xiàn)在,當我們計算窗口的質(zhì)心與中心 C1 不匹配時。所以我們移動窗口,使 c1_r 成為窗口的新中心?,F(xiàn)在我們的窗口已經(jīng)移動了,讓我們再次計算質(zhì)心并繼續(xù)相同的過程。這樣我們的窗口就會移動到點數(shù)較多的部分。這將一直持續(xù)到質(zhì)心停止移動或任何特定的停止標準。
因此,我們需要一個指示函數(shù),它可以為我們正在跟蹤的對象的像素值輸出更高的概率值,并為所有其他像素輸出更低的值。Meanshift 將在每次迭代中進行加權(quán)質(zhì)心計算,因此它會偏向具有更高權(quán)重(概率)的像素,這正是我們想要的,因為與 roi 相似的像素將具有更高的概率值。
我們的目標是跟蹤視頻中出現(xiàn)的黃色汽車。為此,讓我們首先加載視頻。
這里我們將使用 opencv 庫。我們將創(chuàng)建一個視頻捕捉對象。視頻應作為參數(shù)傳遞。以下代碼片段為我們完成了工作。
import cv2cap = cv2.VideoCapture(‘6.mp4’)
如前所述,我們必須從應用均值平移算法的地方隨機初始化 roi。我手動計算了初始位置,因為 meanshift 本身無法做到。
frame_h,frame_w = frame.shape[:2]size = (frame_h,frame_w)w =frame_w//8h =frame_h//8x =600y =320track_window = (x,y,w,h)
從視頻中可以看出,汽車的顏色是黃色,很容易與其他物體的顏色區(qū)分開來。因此,我們想將 RGB 色彩空間轉(zhuǎn)換為 HSV。HSV 模型的色調(diào)成分幫助我們更好地理解物體的顏色??紤]下面的代碼片段。
roi =frame[y:y+h, x-w:x]hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)mask = Noneroi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0,180])cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)
在第一行中,我們定義了感興趣的區(qū)域。然后我們將幀從bgr 顏色空間轉(zhuǎn)換為 hsv 顏色空間。Mask 被聲明為 none,因為我們要計算整個幀的直方圖。在第 4 行中,我們計算了感興趣區(qū)域的直方圖。為此,我們僅考慮了第 4 行的第二個參數(shù)中隱含的色調(diào)通道。Opencv 通常有 180 個色調(diào)值(盡管也可以有 360 個),我們在這里考慮了 180 個 bin(每個值 1 個 bin)。最后一個參數(shù)是我們考慮了所有 180 個色調(diào)值的范圍。在下一步中,我們將 roi 歸一化在 0-255 范圍內(nèi)。
term_crit =(cv2.TERM_CRITERIA_COUNT | cv2.TERM_CRITERIA_EPS,10,1)表示均值漂移算法的終止標準也很重要。我們將在 10 次迭代后或當偏移不超過 1 個像素時停止計算質(zhì)心。
true,frame = cap.read()while true:hsv =cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)back_project = cv2.calcBackProject([hsv], [0],roi_hist, [0,180],1)num_iters,window = cv2.meanShift(back_proj,track_window,term_crit)x,y,w,h =windowcv2.rectangle(frame,(x,y),(x+w,y+h),(255,0,0),2)cv2.imshow(‘back-projection’,back_project)cv2.imshow('meanshift',frame)
cap.read() 返回一個布爾值。如果幀被正確讀取,它將是真的。獲得幀后,我們會將其轉(zhuǎn)換為 hsv 顏色空間。將幀轉(zhuǎn)換為 hsv 顏色空間后,我們將使用預先計算的直方圖進行反向投影,以了解幀的哪一部分具有我們感興趣的對象。然后我們應用了meanshift算法來跟蹤對象。然后我們的工作是將結(jié)果可視化,這是由 imshow 函數(shù)完成的。
盡管該算法在這種情況下表現(xiàn)出色,但仍然幾乎沒有缺點。例如,我們必須手動給出我們感興趣的對象的位置,這對于任何現(xiàn)實生活中的實現(xiàn)都是不可取的。此外,窗口大小不會隨著被跟蹤幀中對象的大小而改變。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

