關注「深度學習衝鴨」,一起學習一起衝鴨!
設為星標,第一時間獲取更多乾貨
後臺回復西瓜手推獲得西瓜書手推筆記
後臺回復CV入坑必備獲得CV入坑學習資料
在上一篇文章中,我們簡單了解一下光流法的原理.
在這一篇文章中,我們使用OpenCV中的calcOpticalFlowPyrLK()函數來實現,是基於金字塔LK光流算法,計算某些點集的稀疏光流。
這個函數的具體介紹在
http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowfarneback
這個網址有很詳細的介紹,一些具體的參數需要去這個網站上看一下.
在接下來,我們來看一下在OpenCV中lk算法的實現.
代碼的路徑在opencv\sources\samples\python\lk_track.py
代碼本身有英文的注釋,我一起把注釋翻譯成中文,捋順以後發現原理還是很好理解.
import numpy as npimport cv2 as cv
cap = cv.VideoCapture("test.avi")# params for ShiTomasi corner detection 設置 ShiTomasi 角點檢測的參數feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7, blockSize=7)# Parameters for lucas kanade optical flow 設置 lucas kanade 光流場的參數# maxLevel 為使用的圖像金字塔層數lk_params = dict(winSize=(15, 15), maxLevel=2, criteria=(cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 0.03))# Create some random colors 產生隨機的顏色值color = np.random.randint(0, 255, (100, 3))# Take first frame and find corners in it 獲取第一幀,並尋找其中的角點(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 創建一個掩膜為了後面繪製角點的光流軌跡mask = np.zeros_like(old_frame)
# 視頻文件輸出參數設置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 能夠獲取點的新位置 p1, st, err = cv.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params) # Select good points 取好的角點,並篩選出舊的角點對應的新的角點 good_new = p1[st == 1] good_old = p0[st == 1] # draw the tracks 繪製角點的軌跡 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 更新當前幀和當前角點的位置 old_gray = frame_gray.copy() p0 = good_new.reshape(-1, 1, 2)
out.release()cv.destroyAllWindows()cap.release()
運行之後的結果:
可以看到這個算法實現起來效果很差,不過沒關係,到後來一步一步我們的算法會變得很優秀,追蹤的效率也會很順暢.大家亦可以改改裡邊的參數,發現效果還是有很大的不一樣.
最後,有關LK光流法,推薦看一看這一篇論文《Pyramidal Implementation of the Lucas Kanade Feature TrackerDescription of the algorithm》,會有更大的收穫.
!重磅!【深度學習衝鴨技術交流二群】微信交流群已成立
額外贈送福利資源!南京大學《模式識別》PPT,2020最新版《神經網絡與深度學習》中文版pdf,李航老師《統計學習方法》(第2版)課件分享,周志華《機器學習》西瓜書手推筆記(V2.8)
獲取方式:進入群後點開群公告即可領取下載連結