OpenCV學習筆記 MeanShift

2021-08-20 12:53:17 字數 2887 閱讀 9625

一、原理

假設我們有一堆點(比如直方圖反向投影得到的點),和乙個小的圓形視窗,我們要完成的任務就是將這個視窗移動到最大灰度密度處(也就是點最多的地方)。如下圖所示:

初始視窗是藍色的c1,它的圓心為藍色方框的c1_o,而視窗中所有點質心卻是c1_r,很明顯圓心和點的質心沒有重合。所以移動圓心c1_o到質心c1_r,這樣我們就得到了乙個新的視窗。這時又可以找到新的視窗內所以點的質心,大多數情況下還是不重合,所以重複上面的操作直到:將新視窗的圓心和它所包含的點的質心重合,這樣我們的視窗會落在畫素值(和)最大的地方。如上圖c2是視窗的最後位置,它包含的畫素點最多。

具體數學原理,參考

meanshift原理,

meanshift數學公式

二、實現步驟

1、讀入參考影象,設定感興趣區域(roi)

2、獲取感興趣區域的色調直方圖

3、讀取新影象計算色調直方圖的反向投影

4、使用meanshift演算法在反向投影中定位

三、函式及**

meanshift(probimage, window, criteria)
probimage: 概率分布影象,也就是roi色調直方圖的反向投影

window: 初始搜尋視窗,就是定義roi的rect

criteria:  確定視窗搜尋停止的準則,

迭代次數達到設定的最大值;視窗中心的漂移值小於某個設定的限值。

importcv2ascv

importnumpyasnp

frommatplotlibimportpyplotasplt

cap = cv.videocapture('img/slow.flv')

#讀取第一幀影象

#設定初始視窗引數

r, h, c, w = 190, 30, 300, 90

track_window = (c, r, w, h)

#獲取roi

roi = frame[r:r+h, c:c+w]

cv.rectangle(frame, (c, r), (c+w, r+h), (0, 255, 0), 2)

cv.imshow('img', frame)

cv.imshow('roi', roi)

#轉成hsv格式

hsv_roi = cv.cvtcolor(roi, cv.color_bgr2hsv)

# 將低亮度的值忽略掉

lower_hsv = np.array([0, 0, 0])

upper_hsv = np.array([180, 255, 46]) #黑色

mask = cv.inrange(hsv_roi, lowerb=lower_hsv, upperb=upper_hsv)

#顏色直方圖

roi_hist = cv.calchist([hsv_roi], [0], mask, [180], [0, 180])

#歸一化

cv.normalize(roi_hist, roi_hist, 0, 255, cv.norm_minmax)

#確定視窗搜尋停止的準則,迭代次數達到設定的最大值,或者視窗中心的漂移值小於設定值

term_crit = (cv.term_criteria_eps | cv.term_criteria_count, 10, 1)

while true:

ret, frame = cap.read()

ifretis true:

hsv = cv.cvtcolor(frame, cv.color_bgr2hsv)

#直方圖反向投影

dst = cv.calcbackproject([hsv], [0], roi_hist, [0, 180], 1)

#返回迭代次數和更新後的邊框

ret, track_window = cv.meanshift(dst, track_window, term_crit)

print(ret)

#在影象中畫出

opencv學習筆記

總的來說,我們學習影象處理的就是從vs和opencv開始的。而在之前的學習中,我們使用了前人的通過或攝像頭的人臉識別 並順利執行了程式。順理成章地,接下來的階段就是將這些 給 吃透 理解並吸收,掌握其中的知識。下面就是今天對於 中幾個重要組成部分的學習心得總結。一 命名空間 using namesp...

openCV學習筆記

1 imread函式 mat imread const string filename,intflags 1 mat image0 imread dota.jpg cv load image anydepth cv load image anycolor 載入最真實的影象 ge1 imread do...

OpenCV學習筆記

初次學習計算機視覺,接觸到了opencv這個開源的計算機視覺庫,現在開始逐漸整理學習過程中自己遇到的最基本東西,因為自己比較笨,所以便把自己在學習中遇到的各種奇葩簡單問題都一一記錄下來,希望對初學的你有所幫助。大佬就忽略我的存在吧。1.什麼是命名空間?using namespace cv 在寫 的時...