一、原理
假設我們有一堆點(比如直方圖反向投影得到的點),和乙個小的圓形視窗,我們要完成的任務就是將這個視窗移動到最大灰度密度處(也就是點最多的地方)。如下圖所示:
初始視窗是藍色的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: 確定視窗搜尋停止的準則,
迭代次數達到設定的最大值;視窗中心的漂移值小於某個設定的限值。
importcv2ascvimportnumpyasnp
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 在寫 的時...