摘要:提供了另一種算法來查找密集的光流。它計算幀中所有點的光流。它基于的算法,該算法在于年的中進行了解釋
Optical Flow
光流法光流是由對象或相機的移動引起的兩個連續幀之間的圖像對象的明顯運動的模式.它是2D矢量場,其中每個矢量是位移矢量,表示從第一幀到第二幀的點的移動.
上圖表示的是一個球在連續的5幀圖像中的運動,箭頭顯示其位移矢量.
光流法原理的基礎:
目標像素強度在連續幀之間不變
相鄰像素具有相似的運動
第一幀的像素I(x,y,t),在dt時間之后的下一幀中移動距離(dx,dy),因為這些像素是相同的,而且亮度不變,所以:
$$ I(x,y,t) = I(x+dx, y+dy, t+dt) $$
然后采用右側的泰勒級數展開,刪除常用項并除以dt得到:
$$ I(x,y,t) = I(x+dx, y+dy, t+dt) $$
在這里:
$$ f_x = frac{partial f}{partial x} ; ; ; f_y = frac{partial f}{partial y} $$
$$ u = frac{dx}{dt} ; ; ; v = frac{dy}{dt} $$
上述方程稱為光流方程.在其中,我們可以找到fx和fy,它們是圖像漸變. 類似地,ft是沿時間的梯度,(u,v) 未知,我們無法用兩個未知變量來解決這個方程.因此提供了幾種方法來解決這個問題,其中一種方法是Lucas-Kanade.
Lucas-Kanade我們之前已經看到一個假設,即所有相鄰像素將具有相似的運動.Lucas-Kanade方法需要窗口大小,所有9個點都有相同的動作,我們可以找到這9個點的(f x,f y,f t). 所以現在我們的問題變成解決了9個方程式,其中兩個未知變量是過度確定的.解的個數大于未知數的個數,這是個超定方程,使用最小二乘的方法來求解最優值.
$$ egin{bmatrix} u v end{bmatrix} = egin{bmatrix} sum_{i}{f_{x_i}}^2 & sum_{i}{f_{x_i} f_{y_i} } sum_{i}{f_{x_i} f_{y_i}} & sum_{i}{f_{y_i}}^2 end{bmatrix}^{-1} egin{bmatrix} - sum_{i}{f_{x_i} f_{t_i}} - sum_{i}{f_{y_i} f_{t_i}} end{bmatrix} $$
所以從用戶的角度來看,想法很簡單,給出一些跟蹤點,從而那些點的光流向量,但是到現在為止,我們只處理了小動議,所以當有大的運動時它會失敗.
使用的解決辦法是利用圖像金字塔,在金字塔頂端的小尺寸圖片當中,大幅度的運動就變成了小幅度的運動, 因此,在那里應用Lucas-Kanade,可以得到尺度空間上的光流.
import numpy as np import cv2 import matplotlib.pyplot as plt cap = cv2.VideoCapture("test.mp4") # params for ShiTomasi corner detection feature_params = dict( maxCorners = 100, qualityLevel = 0.3, minDistance = 7, blockSize = 7 ) # Parameters for lucas kanade optical flow lk_params = dict( winSize = (15,15), maxLevel = 2, criteria = (cv2.TERM_CRITERIA_EPS | cv2.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 = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray, mask = None, **feature_params) # Create a mask image for drawing purposes mask = np.zeros_like(old_frame) while(1): ret,frame = cap.read() frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # calculate optical flow p1, st, err = cv2.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 = cv2.line(mask, (a,b),(c,d), color[i].tolist(), 2) frame = cv2.circle(frame,(a,b),5,color[i].tolist(),-1) img = cv2.add(frame,mask) cv2.imshow("frame",img) k = cv2.waitKey(30) & 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) cv2.destroyAllWindows() cap.release()Dense Optical Flow in OpenCV
Lucas-Kanade方法計算稀疏特征集的光流(在我們的例子中,使用Shi-Tomasi算法檢測到的角)。 OpenCV提供了另一種算法來查找密集的光流。 它計算幀中所有點的光流。 它基于Gunner Farneback的算法,該算法在Gunner Farneback于2003年的“Two-Frame Motion Estimation Based on Polynomial Expansion”中進行了解釋.
import numpy as np import cv2 import matplotlib.pyplot as plt cap = cv2.VideoCapture("test.mp4") ret, frame1 = cap.read() prvs = cv2.cvtColor(frame1,cv2.COLOR_BGR2GRAY) hsv = np.zeros_like(frame1) hsv[...,1] = 255 while(1): ret, frame2 = cap.read() next = cv2.cvtColor(frame2,cv2.COLOR_BGR2GRAY) flow = cv2.calcOpticalFlowFarneback(prvs,next, None, 0.5, 3, 15, 3, 5, 1.2, 0) mag, ang = cv2.cartToPolar(flow[...,0], flow[...,1]) hsv[...,0] = ang*180/np.pi/2 hsv[...,2] = cv2.normalize(mag,None,0,255,cv2.NORM_MINMAX) bgr = cv2.cvtColor(hsv,cv2.COLOR_HSV2BGR) cv2.imshow("frame2",bgr) k = cv2.waitKey(30) & 0xff if k == 27: break elif k == ord("s"): cv2.imwrite("opticalfb.png",frame2) cv2.imwrite("opticalhsv.png",bgr) prvs = next cap.release() cv2.destroyAllWindows()
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42092.html
摘要:目前,支持尚未完成僅支持加載編碼的和,還未支持編碼。部分支持對象檢測網絡的版本缺少一些提供矩形列表的最終圖層。而且,此更改也已添加到分支。請注意,僅在英特爾上進行測試,因此仍需要額外的。為了使實時采集處理有高效,在模塊中更新了支持。 OpenCV 4.0 正式版來啦!雖然官網還沒更新,但Github已經放出來了!重回英特爾的OpenCV終于迎來一次大版本更新,增加了諸多新特性,快來一起看看吧...
摘要:十開放模式識別項目開放模式識別項目,致力于開發出一套包含圖像處理計算機視覺自然語言處理模式識別機器學習和相關領域算法的函數庫。 一、開源生物特征識別庫 OpenBROpenBR 是一個用來從照片中識別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計算機視覺庫 OpenCVOpenC...
摘要:對于非雙峰圖像,二值化不準確。如果未使用閾值法,則與之前使用的閾值相同在第一種情況下,將全局閾值應用為值在第二種情況下,直接應用了的閾值在第三種情況下,使用高斯內核過濾圖像以消除噪聲,然后應用閾值處理代碼 Image Thresholding 1簡單的閾值化 cv2.threshold第一個參數是源圖像,它應該是灰度圖像. 第二個參數是用于對像素值進行分類的閾值, 第三個參數是max...
閱讀 2371·2021-11-18 10:07
閱讀 2325·2021-09-22 15:59
閱讀 3085·2021-08-23 09:42
閱讀 2283·2019-08-30 15:44
閱讀 1198·2019-08-29 15:06
閱讀 2317·2019-08-29 13:27
閱讀 1219·2019-08-29 13:21
閱讀 1420·2019-08-29 13:13