OpenCV-Python教程:43.meanshift和camshift

meanshift

meanshift 背后的直覺很簡(jiǎn)單吁断,設(shè)想你有一個(gè)點(diǎn)集。(可以是一個(gè)像素分布庶溶,像直方圖向后投影)宅此。你得到一個(gè)小窗口(可能是個(gè)圓)并且你得移動(dòng)窗口到最大像素強(qiáng)度的地方(或者最多點(diǎn)的數(shù)量)

初始化的窗口顯示成藍(lán)色圓,名字叫“C1”褐捻,它的圓心是藍(lán)方塊“C1_o”掸茅。但是如果你找窗口里的點(diǎn)的質(zhì)心,那就在點(diǎn)"C1_r"(用藍(lán)色小圓標(biāo)記)柠逞,這是窗口的實(shí)際質(zhì)心昧狮,所以它們不匹配。所以移動(dòng)你的窗口讓新窗口的圓圈和前一個(gè)的質(zhì)心匹配板壮。再次逗鸣,找到新的質(zhì)心,很可能是還是不匹配绰精,然后再次移動(dòng)撒璧,不斷迭代知道窗口的中心和質(zhì)心落在同一個(gè)位置(或者誤差可接受)。最后你獲得的窗口有最多的像素分布笨使,用綠色的圓標(biāo)記卿樱。叫C2,在圖里可以看到他有最多的點(diǎn)硫椰。下圖展示了整個(gè)過程殿如。

所以我們一般傳入直方圖向后投影圖像和初始化的目標(biāo)位置。當(dāng)目標(biāo)移動(dòng)時(shí)最爬,移動(dòng)被反應(yīng)在直方圖向后投影圖像里涉馁,作為結(jié)果,均值平移算法吧我們的窗口移到有最大亮度的位置爱致。

OpenCV里的均值平移

要在OpenCV里使用均值平移烤送,首先我們需要設(shè)置目標(biāo),找到他的直方圖糠悯,這樣我們可以為了計(jì)算均值平移向后投影目標(biāo)到每一幀上帮坚。我們也需要提供窗口的初始位置。對(duì)于直方圖互艾,只考慮色調(diào)试和。要避免低光線帶來(lái)的錯(cuò)誤值,低光線的值使用cv2.inRange()函數(shù)來(lái)丟棄掉纫普。

import numpy as np
import cv2

cap = cv2.VideoCapture('slow.flv')

# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
r,h,c,w = 250,90,400,125? # simply hardcoded the values
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
hsv_roi =? cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
? ? ret ,frame = cap.read()
? ?
? ? if ret == True:
? ? ? ? hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
? ? ? ? dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

? ? ? ? # apply meanshift to get the new location
? ? ? ? ret, track_window = cv2.meanShift(dst, track_window, term_crit)

? ? ? ? # Draw it on image
? ? ? ? x,y,w,h = track_window
? ? ? ? img2 = cv2.rectangle(frame, (x,y), (x+w,y+h), 255,2)
? ? ? ? cv2.imshow('img2',img2)

? ? ? ? k = cv2.waitKey(60) & 0xff
? ? ? ? if k == 27:
? ? ? ? ? ? break
? ? ? ? else:
? ? ? ? ? ? cv2.imwrite(chr(k)+".jpg",img2)

? ? ? ? else:
? ? ? ? ? ? break

cv2.destroyAllWindows()
cap.release()

我使用的視頻里的三幀如下:

camshift

你仔細(xì)看之前的結(jié)果沒阅悍?有一個(gè)問題,我們的窗口總是同樣的大小,當(dāng)汽車從遠(yuǎn)處走得離攝像頭越來(lái)越近节视,這并不好拳锚。我們需要讓窗口的大小和目標(biāo)的大小以及旋轉(zhuǎn)相適應(yīng)。這個(gè)解決方案也是來(lái)自O(shè)penCV實(shí)驗(yàn)室寻行,叫做CAMshift(連續(xù)的適應(yīng)性均值平移)

它首先應(yīng)用均值平移霍掺,當(dāng)均值平移覆蓋后,它更新窗口的大小拌蜘,

它也計(jì)算最適合的橢圓的方向杆烁,然后它在使用新的大小的窗口在之前的位置開始進(jìn)行均值平移,過程不斷繼續(xù)直到到達(dá)指定的準(zhǔn)確率简卧。

OpenCV里的camshift

和meanshift幾乎一樣兔魂,但是它返回旋轉(zhuǎn)的舉行和盒子參數(shù)

import numpy as np
import cv2

cap = cv2.VideoCapture('slow.flv')

# take first frame of the video
ret,frame = cap.read()

# setup initial location of window
r,h,c,w = 250,90,400,125? # simply hardcoded the values
track_window = (c,r,w,h)

# set up the ROI for tracking
roi = frame[r:r+h, c:c+w]
hsv_roi =? cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60.,32.)), np.array((180.,255.,255.)))
roi_hist = cv2.calcHist([hsv_roi],[0],mask,[180],[0,180])
cv2.normalize(roi_hist,roi_hist,0,255,cv2.NORM_MINMAX)

# Setup the termination criteria, either 10 iteration or move by atleast 1 pt
term_crit = ( cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1 )

while(1):
? ? ret ,frame = cap.read()

? ? if ret == True:
? ? ? ? hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
? ? ? ? dst = cv2.calcBackProject([hsv],[0],roi_hist,[0,180],1)

? ? ? ? # apply meanshift to get the new location
? ? ? ? ret, track_window = cv2.CamShift(dst, track_window, term_crit)

? ? ? ? # Draw it on image
? ? ? ? pts = cv2.boxPoints(ret)
? ? ? ? pts = np.int0(pts)
? ? ? ? img2 = cv2.polylines(frame,[pts],True, 255,2)
? ? ? ? cv2.imshow('img2',img2)

? ? ? ? k = cv2.waitKey(60) & 0xff
? ? ? ? if k == 27:
? ? ? ? ? ? break
? ? ? ? else:
? ? ? ? ? ? cv2.imwrite(chr(k)+".jpg",img2)

? ? else:
? ? ? ? break

cv2.destroyAllWindows()
cap.release()


END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市贞滨,隨后出現(xiàn)的幾起案子入热,更是在濱河造成了極大的恐慌,老刑警劉巖晓铆,帶你破解...
    沈念sama閱讀 216,651評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勺良,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡骄噪,警方通過查閱死者的電腦和手機(jī)尚困,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)链蕊,“玉大人事甜,你說我怎么就攤上這事√显希” “怎么了逻谦?”我有些...
    開封第一講書人閱讀 162,931評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)陪蜻。 經(jīng)常有香客問我邦马,道長(zhǎng),這世上最難降的妖魔是什么宴卖? 我笑而不...
    開封第一講書人閱讀 58,218評(píng)論 1 292
  • 正文 為了忘掉前任滋将,我火速辦了婚禮,結(jié)果婚禮上症昏,老公的妹妹穿的比我還像新娘随闽。我一直安慰自己,他們只是感情好肝谭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,234評(píng)論 6 388
  • 文/花漫 我一把揭開白布掘宪。 她就那樣靜靜地躺著蛾扇,像睡著了一般。 火紅的嫁衣襯著肌膚如雪添诉。 梳的紋絲不亂的頭發(fā)上屁桑,一...
    開封第一講書人閱讀 51,198評(píng)論 1 299
  • 那天医寿,我揣著相機(jī)與錄音栏赴,去河邊找鬼。 笑死靖秩,一個(gè)胖子當(dāng)著我的面吹牛须眷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沟突,決...
    沈念sama閱讀 40,084評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼花颗,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了惠拭?” 一聲冷哼從身側(cè)響起扩劝,我...
    開封第一講書人閱讀 38,926評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎职辅,沒想到半個(gè)月后棒呛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,341評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡域携,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,563評(píng)論 2 333
  • 正文 我和宋清朗相戀三年簇秒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秀鞭。...
    茶點(diǎn)故事閱讀 39,731評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡趋观,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锋边,到底是詐尸還是另有隱情皱坛,我是刑警寧澤,帶...
    沈念sama閱讀 35,430評(píng)論 5 343
  • 正文 年R本政府宣布豆巨,位于F島的核電站剩辟,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏搀矫。R本人自食惡果不足惜抹沪,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,036評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瓤球。 院中可真熱鬧融欧,春花似錦、人聲如沸卦羡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至欠肾,卻和暖如春瓶颠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背刺桃。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工粹淋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瑟慈。 一個(gè)月前我還...
    沈念sama閱讀 47,743評(píng)論 2 368
  • 正文 我出身青樓桃移,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親葛碧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子借杰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,629評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容