CV學(xué)習(xí)筆記(九):光流法的實(shí)現(xiàn)

在上一篇文章中,我們簡(jiǎn)單了解一下光流法的原理.

在這一篇文章中,我們使用OpenCV中的calcOpticalFlowPyrLK()函數(shù)來(lái)實(shí)現(xiàn),是基于金字塔LK光流算法爹袁,計(jì)算某些點(diǎn)集的稀疏光流。

這個(gè)函數(shù)的具體介紹在

http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarneback

這個(gè)網(wǎng)址有很詳細(xì)的介紹,一些具體的參數(shù)需要去這個(gè)網(wǎng)站上看一下.

在接下來(lái),我們來(lái)看一下在OpenCV中l(wèi)k算法的實(shí)現(xiàn).

代碼的路徑在opencv\sources\samples\python\lk_track.py

代碼本身有英文的注釋,我一起把注釋翻譯成中文,捋順以后發(fā)現(xiàn)原理還是很好理解.

import numpy as np

import cv2 as cv

cap = cv.VideoCapture("test.avi")

# params for ShiTomasi corner detection 設(shè)置 ShiTomasi 角點(diǎn)檢測(cè)的參數(shù)

feature_params = dict(maxCorners=100,

? ? ? ? ? ? ? ? ? ? ? qualityLevel=0.3,

? ? ? ? ? ? ? ? ? ? ? minDistance=7,

? ? ? ? ? ? ? ? ? ? ? blockSize=7)

# Parameters for lucas kanade optical flow 設(shè)置 lucas kanade 光流場(chǎng)的參數(shù)

# maxLevel 為使用的圖像金字塔層數(shù)

lk_params = dict(winSize=(15, 15),

? ? ? ? ? ? ? ? maxLevel=2,

? ? ? ? ? ? ? ? criteria=(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))

# Create some random colors 產(chǎn)生隨機(jī)的顏色值

color = np.random.randint(0, 255, (100, 3))

# Take first frame and find corners in it 獲取第一幀耘沼,并尋找其中的角點(diǎn)

(ret, old_frame) = cap.read()

old_gray = cv.cvtColor(old_frame, cv.COLOR_BGR2GRAY)

p0 = cv.goodFeaturesToTrack(old_gray, mask=None, **feature_params)

# Create a mask image for drawing purposes 創(chuàng)建一個(gè)掩膜為了后面繪制角點(diǎn)的光流軌跡

mask = np.zeros_like(old_frame)

# 視頻文件輸出參數(shù)設(shè)置

out_fps = 12.0? # 輸出文件的幀率

fourcc = cv.VideoWriter_fourcc('M', 'P', '4', '2')

sizes = (int(cap.get(cv.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)))

out = cv.VideoWriter('E:/video/v5.avi', fourcc, out_fps, sizes)

while True:

? ? (ret, frame) = cap.read()

? ? frame_gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

? ? # calculate optical flow 能夠獲取點(diǎn)的新位置

? ? p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)

? ? # Select good points 取好的角點(diǎn)豪硅,并篩選出舊的角點(diǎn)對(duì)應(yīng)的新的角點(diǎn)

? ? good_new = p1[st == 1]

? ? good_old = p0[st == 1]

? ? # draw the tracks 繪制角點(diǎn)的軌跡

? ? for i, (new, old) in enumerate(zip(good_new, good_old)):

? ? ? ? a, b = new.ravel()

? ? ? ? c, d = old.ravel()

? ? ? ? mask = cv.line(mask, (a, b), (c, d), color[i].tolist(), 2)

? ? ? ? frame = cv.circle(frame, (a, b), 5, color[i].tolist(), -1)

? ? img = cv.add(frame, mask)

? ? cv.imshow('frame', img)

? ? out.write(img)

? ? k = cv.waitKey(200) & 0xff

? ? if k == 27:

? ? ? ? break

? ? # Now update the previous frame and previous points 更新當(dāng)前幀和當(dāng)前角點(diǎn)的位置

? ? old_gray = frame_gray.copy()

? ? p0 = good_new.reshape(-1, 1, 2)

out.release()

cv.destroyAllWindows()

cap.release()

運(yùn)行之后的結(jié)果:

可以看到這個(gè)算法實(shí)現(xiàn)起來(lái)效果很差,不過(guò)沒(méi)關(guān)系,到后來(lái)一步一步我們的算法會(huì)變得很優(yōu)秀,追蹤的效率也會(huì)很順暢.大家亦可以改改里邊的參數(shù),發(fā)現(xiàn)效果還是有很大的不一樣.

最后,有關(guān)LK光流法,推薦看一看這一篇論文《Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm》,會(huì)有更大的收獲.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末絮吵,一起剝皮案震驚了整個(gè)濱河市开皿,隨后出現(xiàn)的幾起案子咆疗,更是在濱河造成了極大的恐慌漓帚,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件午磁,死亡現(xiàn)場(chǎng)離奇詭異尝抖,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)迅皇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門昧辽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人登颓,你說(shuō)我怎么就攤上這事搅荞。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵咕痛,是天一觀的道長(zhǎng)痢甘。 經(jīng)常有香客問(wèn)我,道長(zhǎng)暇检,這世上最難降的妖魔是什么产阱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮块仆,結(jié)果婚禮上构蹬,老公的妹妹穿的比我還像新娘。我一直安慰自己悔据,他們只是感情好庄敛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著科汗,像睡著了一般藻烤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上头滔,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天怖亭,我揣著相機(jī)與錄音,去河邊找鬼坤检。 笑死兴猩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的早歇。 我是一名探鬼主播倾芝,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼箭跳!你這毒婦竟也來(lái)了晨另?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谱姓,失蹤者是張志新(化名)和其女友劉穎借尿,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屉来,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡路翻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奶躯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片帚桩。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡亿驾,死狀恐怖嘹黔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤儡蔓,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布郭蕉,位于F島的核電站,受9級(jí)特大地震影響喂江,放射性物質(zhì)發(fā)生泄漏召锈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一获询、第九天 我趴在偏房一處隱蔽的房頂上張望涨岁。 院中可真熱鬧,春花似錦吉嚣、人聲如沸梢薪。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)秉撇。三九已至,卻和暖如春秋泄,著一層夾襖步出監(jiān)牢的瞬間琐馆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工恒序, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘦麸,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓奸焙,卻偏偏與公主長(zhǎng)得像瞎暑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子与帆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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