日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Lucas-Kanade稀疏光流法

發(fā)布時(shí)間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lucas-Kanade稀疏光流法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
光流法

光流

由于目標(biāo)對(duì)象或者攝像機(jī)的移動(dòng)造成的圖像對(duì)象在連續(xù)兩幀圖像中的移動(dòng)被稱為光流。如下圖所示,它是一個(gè) 2D 向量場(chǎng),可以用來(lái)顯示一個(gè)點(diǎn)從第一幀圖像到第二幀圖像之間的移動(dòng),箭頭表示光流場(chǎng)向量。

其中,光流包括稀疏光流與稠密光流。圖像中的每個(gè)像素都使用這種方法,則通常將其稱為“稠密光流”。有一種替代類算法被稱為“稀疏光流”,僅僅跟蹤圖像中某些點(diǎn)的子集。

Lucas-Kanade稀疏光流法

假設(shè)先驗(yàn)

LK光流全稱為L(zhǎng)ucas-Kanade光流,算法原理比較好理解,首先,LK光流對(duì)應(yīng)用場(chǎng)景提出了三個(gè)假設(shè)先驗(yàn):

  • 亮度恒定:假設(shè)像素在運(yùn)動(dòng)過程中亮度(灰度值)恒定,其實(shí)這是大部分計(jì)算機(jī)視覺任務(wù)都需要的一個(gè)先驗(yàn)。
  • 像素偏移小:檢測(cè)光流的兩幀之間不能有過大的motion,否則LK光流會(huì)檢測(cè)失敗。
  • 空間一致性:當(dāng)前幀相鄰的像素在下一幀應(yīng)該也是相鄰的,這樣便于求解圖像塊的梯度進(jìn)而尋找到匹配的像素。

算法流程
給定t 時(shí)刻的圖像上的像素點(diǎn)I(x,y) ,算法的目標(biāo)是找到在下一時(shí)刻該像素的在各個(gè)方向上的位移,用公式表達(dá)就是:
I(x,y,t)=I(x+δx,y+δy,t+δt)(1)I ( x , y , t ) = I ( x + \delta x , y + \delta y , t + \delta t ) \tag{1} I(x,y,t)=I(x+δx,y+δy,t+δt)(1)

可以對(duì)等號(hào)右邊的式子采用泰勒展開:

可以看到等號(hào)后邊第一項(xiàng)與等號(hào)左邊相等可以消去,?I?x\frac{\partial I}{\partial x}?x?I??I?y\frac{\partial I}{\partial y}?y?I? 比較好理解,就是當(dāng)前時(shí)刻圖像在δxδxδxδyδyδy方向的梯度了,?I?t\frac{\partial I}{\partial t}?t?I? 表示的的是時(shí)間方向上的梯度,也就是下一幀與當(dāng)前幀的差分。δtδtδt是兩幀時(shí)間差也就是1,而δxδxδxδyδyδy就是我們要求解的像素運(yùn)動(dòng)。由此我們可以得到:
Ixδx+Iyδy=?It(3)I _ { x } \delta x + I _ { y } \delta y = - I _ { t }\tag{3} Ix?δx+Iy?δy=?It?(3)
我們現(xiàn)在有兩個(gè)未知數(shù)但是只有一個(gè)方程,無(wú)法求解,根據(jù)我們?cè)谧铋_始的第三個(gè)假設(shè),此時(shí)我們可以使用需要求解的像素周圍5×5的像素塊來(lái)幫助我們得到更多的方程式:
[Ix1Iy1Ix2Iy2?Ix24Iy24Ix25Iy25][δxδy]=[?It1?It2??It24?It25](4)\left[ \begin{array} { c } { I _ { x 1 } I _ { y 1 } } \\ { I _ { x 2 } I _ { y 2 } } \\ { \cdots } \\ { I _ { x 24 } I _ { y 24 } } \\ { I _ { x 25 } I _ { y 25 } } \end{array} \right] \left[ \begin{array} { c } { \delta x } \\ { \delta y } \end{array} \right] = \left[ \begin{array} { c } { - I _ { t 1 } } \\ { - I _ { t 2 } } \\ { \cdots } \\ { - I _ { t 24 } } \\ { - I _ { t 25 } } \end{array} \right]\tag{4} ???????Ix1?Iy1?Ix2?Iy2??Ix24?Iy24?Ix25?Iy25?????????[δxδy?]=????????It1??It2???It24??It25?????????(4)
此時(shí)便組成了一個(gè)超定方程組,也就是方程個(gè)數(shù)大于未知數(shù)個(gè)數(shù),這是我們可以使用最小二乘法來(lái)求解這個(gè)方程組。
Ax=?bATAx=AT(?b)(5)\begin{aligned} A x & = - b \\ A ^ { T } A x & = A ^ { T } ( - b ) \\ \end{aligned}\tag{5} AxATAx?=?b=AT(?b)?(5)
方程的解必須滿足以下條件:

  • ATAA ^ { T } AATA 必須可逆

  • ATAA ^ { T } AATA 中的特征值λ1\lambda _ { 1 }λ1?λ2\lambda _ { 2 }λ2?不能太小。如下圖所示,當(dāng)特征值過小,說(shuō)明像素塊選在平緩區(qū)域。

  • ATAA ^ { T } AATAλ1/λ2\lambda _ { 1 }/\lambda _ { 2 }λ1?/λ2?不能太大。如下圖所示,當(dāng)λ1/λ2\lambda _ { 1 }/\lambda _ { 2 }λ1?/λ2?過大時(shí),說(shuō)明素塊選在邊緣區(qū)域。

總結(jié)

像素塊不能選在平緩區(qū)域和邊緣區(qū)域。如下圖所示,像素塊最好選在紋理豐富的區(qū)域。

LK光流法存在的問題

在實(shí)際的拍攝的視頻中,每一幀不一定都滿足三個(gè)假設(shè):亮度恒定、像素偏移小和空間一致性。

  • 亮度恒定不滿足,

    解決方法:梯度恒定

  • 像素偏移過大

    解決方法:采樣高斯金字塔方法,估計(jì)光流

  • 像素塊不滿足空間一致性。

代碼實(shí)現(xiàn):

import numpy as np import cv2cap = cv2.VideoCapture("768x576.avi")# ShiTomas角點(diǎn)檢測(cè)的參數(shù) feature_params = dict(maxCorners =100,qualityLevel=0.3,minDistance=7,blockSize=7)# 金字塔LK算法參數(shù) lk_params = dict(winSize=(15,15),maxLevel=2,criteria=(cv2.TERM_CRITERIA_EPS|cv2.TermCriteria_COUNT,10,0.03)) # 創(chuàng)建隨機(jī)顏色 color = np.random.randint(0,255,(100,3))ret,old_frame = cap.read() old_gray = cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY) p0 = cv2.goodFeaturesToTrack(old_gray,mask=None,**feature_params)mask = np.zeros_like(old_frame)while(1):ret,frame = cap.read()if ret is True: frame_gray = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)else: breakp1,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()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)&0xffif k == 27:breakold_gray = frame_gray.copy()p0 = good_new.reshape(-1,1,2)cv2.destroyAllWindows() cap.release()

結(jié)果:

參考文獻(xiàn):

[1] B. Lucas and T. Kanade, “An iterative image registration technique with an
application to stereo vision,” in Proc. of International Joint Conf. On Artificial
Intelligence, pp.674-679, 1981.

[2] 浙江大學(xué)陸系群教授,《Motion Estimation Optical Flow.PPT》

[3] 《OpenCV-Python 中文教程》

[4]LK稀疏光流法

總結(jié)

以上是生活随笔為你收集整理的Lucas-Kanade稀疏光流法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。