成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

opencv python 光流法

muddyway / 2138人閱讀

摘要:提供了另一種算法來(lái)查找密集的光流。它計(jì)算幀中所有點(diǎn)的光流。它基于的算法,該算法在于年的中進(jìn)行了解釋

Optical Flow

光流法

光流是由對(duì)象或相機(jī)的移動(dòng)引起的兩個(gè)連續(xù)幀之間的圖像對(duì)象的明顯運(yùn)動(dòng)的模式.它是2D矢量場(chǎng),其中每個(gè)矢量是位移矢量,表示從第一幀到第二幀的點(diǎn)的移動(dòng).

上圖表示的是一個(gè)球在連續(xù)的5幀圖像中的運(yùn)動(dòng),箭頭顯示其位移矢量.

光流法原理的基礎(chǔ):

目標(biāo)像素強(qiáng)度在連續(xù)幀之間不變

相鄰像素具有相似的運(yùn)動(dòng)

第一幀的像素I(x,y,t),在dt時(shí)間之后的下一幀中移動(dòng)距離(dx,dy),因?yàn)檫@些像素是相同的,而且亮度不變,所以:

$$ I(x,y,t) = I(x+dx, y+dy, t+dt) $$

然后采用右側(cè)的泰勒級(jí)數(shù)展開,刪除常用項(xiàng)并除以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是沿時(shí)間的梯度,(u,v) 未知,我們無(wú)法用兩個(gè)未知變量來(lái)解決這個(gè)方程.因此提供了幾種方法來(lái)解決這個(gè)問(wèn)題,其中一種方法是Lucas-Kanade.

Lucas-Kanade

我們之前已經(jīng)看到一個(gè)假設(shè),即所有相鄰像素將具有相似的運(yùn)動(dòng).Lucas-Kanade方法需要窗口大小,所有9個(gè)點(diǎn)都有相同的動(dòng)作,我們可以找到這9個(gè)點(diǎn)的(f x,f y,f t). 所以現(xiàn)在我們的問(wèn)題變成解決了9個(gè)方程式,其中兩個(gè)未知變量是過(guò)度確定的.解的個(gè)數(shù)大于未知數(shù)的個(gè)數(shù),這是個(gè)超定方程,使用最小二乘的方法來(lái)求解最優(yōu)值.

$$ 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} $$

所以從用戶的角度來(lái)看,想法很簡(jiǎn)單,給出一些跟蹤點(diǎn),從而那些點(diǎn)的光流向量,但是到現(xiàn)在為止,我們只處理了小動(dòng)議,所以當(dāng)有大的運(yùn)動(dòng)時(shí)它會(huì)失敗.
使用的解決辦法是利用圖像金字塔,在金字塔頂端的小尺寸圖片當(dāng)中,大幅度的運(yùn)動(dòng)就變成了小幅度的運(yùn)動(dòng), 因此,在那里應(yīng)用Lucas-Kanade,可以得到尺度空間上的光流.

Lucas-Kanade Optical Flow in OpenCV
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方法計(jì)算稀疏特征集的光流(在我們的例子中,使用Shi-Tomasi算法檢測(cè)到的角)。 OpenCV提供了另一種算法來(lái)查找密集的光流。 它計(jì)算幀中所有點(diǎn)的光流。 它基于Gunner Farneback的算法,該算法在Gunner Farneback于2003年的“Two-Frame Motion Estimation Based on Polynomial Expansion”中進(jìn)行了解釋.

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()

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42092.html

相關(guān)文章

  • 千呼萬(wàn)喚始出來(lái),OpenCV 4.0正式發(fā)布!

    摘要:目前,支持尚未完成僅支持加載編碼的和,還未支持編碼。部分支持對(duì)象檢測(cè)網(wǎng)絡(luò)的版本缺少一些提供矩形列表的最終圖層。而且,此更改也已添加到分支。請(qǐng)注意,僅在英特爾上進(jìn)行測(cè)試,因此仍需要額外的。為了使實(shí)時(shí)采集處理有高效,在模塊中更新了支持。 OpenCV 4.0 正式版來(lái)啦!雖然官網(wǎng)還沒(méi)更新,但Github已經(jīng)放出來(lái)了!重回英特爾的OpenCV終于迎來(lái)一次大版本更新,增加了諸多新特性,快來(lái)一起看看吧...

    nifhlheimr 評(píng)論0 收藏0
  • 機(jī)器視覺、模式識(shí)別庫(kù)匯總

    摘要:十開放模式識(shí)別項(xiàng)目開放模式識(shí)別項(xiàng)目,致力于開發(fā)出一套包含圖像處理計(jì)算機(jī)視覺自然語(yǔ)言處理模式識(shí)別機(jī)器學(xué)習(xí)和相關(guān)領(lǐng)域算法的函數(shù)庫(kù)。 一、開源生物特征識(shí)別庫(kù) OpenBROpenBR 是一個(gè)用來(lái)從照片中識(shí)別人臉的工具。還支持推算性別與年齡。使用方法:$ br -algorithm FaceRecognition -compare me.jpg you.jpg二、計(jì)算機(jī)視覺庫(kù) OpenCVOpenC...

    habren 評(píng)論0 收藏0
  • opencv python 圖像二值化/簡(jiǎn)單閾值化/大津閾值

    摘要:對(duì)于非雙峰圖像,二值化不準(zhǔn)確。如果未使用閾值法,則與之前使用的閾值相同在第一種情況下,將全局閾值應(yīng)用為值在第二種情況下,直接應(yīng)用了的閾值在第三種情況下,使用高斯內(nèi)核過(guò)濾圖像以消除噪聲,然后應(yīng)用閾值處理代碼 Image Thresholding 1簡(jiǎn)單的閾值化 cv2.threshold第一個(gè)參數(shù)是源圖像,它應(yīng)該是灰度圖像. 第二個(gè)參數(shù)是用于對(duì)像素值進(jìn)行分類的閾值, 第三個(gè)參數(shù)是max...

    luoyibu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<