光流与Lucas-Kanade 光流法
光流optical flow是指空間運動物體在觀察成像平面上的像素運動瞬時速度,即由于目標對象或者攝像機移動造成、圖像對象在連續兩幀圖像中的移動。光流是一個 2D 向量場,如下圖所示,可以顯示一個點從第一幀圖像到第二 幀圖像之間的移動:
?
關于光流的假設:目標對象在連續的兩幀圖像之間像素灰度值不改變,并且這些相鄰像素都具有相同的運動。根據這一假設,Lucas-Kanade 利用一個 3x3 鄰域中的 9 具有相同運動的這一點獲得空間尺度上的光流。OpenCV 函數cv2.calcOpticalFlowPyrLK()、cv2.goodFeatureToTrack()等幫助我們跟蹤視頻中的一些點,我們通過下面的圖像先感受一下:
?
光流跟蹤方法:
##### 示例方法: url_path = 'https://img1.baidu.com/it/u=681934324,621431638&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=333' ori_img = url2img(url_path) img = ori_img.copy() color = np.random.randint(0,255,(100,3)) ### 隨機顏色 lk_params = dict( winSize = (15,15), maxLevel = 2,criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))feature_params = dict( maxCorners = 100,qualityLevel = 0.3,minDistance = 7,blockSize = 7 )old_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params) mask = np.zeros_like(img, np.uint8) frame_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) p1, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params) good_new = p1[st==1] good_old = p0[st==1] for i,(new,old) in enumerate(zip(good_new,good_old)):a, b = new.ravel()c, d = old.ravel()[a,b,c,d] = map(int, [a,b,c,d])mask = cv2.line(mask, (a, b), (c, d), color[i].tolist() )frame = cv2.circle(img, (a, b), 5, color[i].tolist(), -1) img = cv2.add(frame, mask) mat = np.hstack((ori_img, img)) cv2.imshow("mat", 'mat')?如下是針對視頻的效果:光流檢測,
https://www.ixigua.com/7103944810792222720?from_scene=all&is_new_connect=0&is_new_user=0&log_from=75482141479d_1654038585719&wid_try=1
今天就分享到這里, 我是paperClub。
備注:WeiXin 搜索paperClub, 添加關注并回復【paperClub】即可獲取使用方法。?
1. 感謝各位小伙伴的關注, 您的點贊、鼓勵和留言,都是我深夜堅持的一份動力,無論褒貶,都是我們行進途中最好的回饋,也都會被認真對待。
2. 我將持續分享各類、好玩且有趣的算法應用及工程和項目,歡迎分享和轉發。溝通、學習和交流,請與我聯系,雖然平時忙,但留言必回,勿急,感謝理解!
3. 分享內容包括開源項目和自研項目,如在引用或使用時,考慮不周、遺漏引用信息或涉及版權等,請您及時聯系。如果您對某些內容感興趣,我們可以一起討論、交流和學習。
?
總結
以上是生活随笔為你收集整理的光流与Lucas-Kanade 光流法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: crypto 抄错的字符
- 下一篇: 小众软件整理总结