稀疏光流跟蹤(KLT)詳解
在視頻移動(dòng)對象跟蹤中,稀疏光流跟蹤是一種經(jīng)典的對象跟蹤算法,可以繪制運(yùn)動(dòng)對象的跟蹤軌跡與運(yùn)行方向,是一種簡單、實(shí)時(shí)高效的跟蹤算法,這個(gè)算法最早是有Bruce D. Lucas and Takeo Kanade兩位作者提出來的,所以又被稱為KLT。KLT算法工作有三個(gè)假設(shè)前提條件:
亮度恒定
短距離移動(dòng)
空間一致性
亮度恒定
對象中任意像素點(diǎn)p(x,y)亮度值,在t-1時(shí)候的值,在t時(shí)刻移動(dòng)(u, v)之后亮度值保持不變
空間一致性
假設(shè)對像素點(diǎn)p(x, y)來說,周圍的像素點(diǎn)都保持相同的移動(dòng)距離(u, v) 假設(shè)窗口大小為5x5,則對于25個(gè)窗口內(nèi)的像素點(diǎn)來說,就會(huì)如下等式成立:
得到下面的過約束等式,根據(jù)最小二乘可以求解(u, v):
這樣我們就得到了KLT光流等式與該窗口的的Hessian矩陣
空間尺度不變性
通過建立每一幀的圖像金字塔,實(shí)現(xiàn)尺度空間窗口目標(biāo)對象搜索
OpenCV中KLT演示代碼實(shí)現(xiàn)
voidcv::calcOpticalFlowPyrLK( InputArrayprevImg,//前一幀圖像 InputArraynextImg,//后一幀圖像 InputArrayprevPts,//前一幀的稀疏光流點(diǎn) InputOutputArraynextPts,//后一幀光流點(diǎn) OutputArraystatus,//輸出狀態(tài),1表示正常該點(diǎn)保留,否則丟棄 OutputArrayerr,//表示錯(cuò)誤 SizewinSize=Size(21,21),//光流法對象窗口大小 intmaxLevel=3,//金字塔層數(shù),0表示只檢測當(dāng)前圖像,不構(gòu)建金字塔圖像 TermCriteriacriteria=TermCriteria(TermCriteria::EPS,30,0.01),//窗口搜索時(shí)候停止條件 intflags=0,//操作標(biāo)志 doubleminEigThreshold=1e-4//最小特征值響應(yīng),低于最小值不做處理 )
特征點(diǎn)檢測與繪制的代碼實(shí)現(xiàn)如下:
//detectfirstframeandfindcornersinit Matold_frame,old_gray; capture.read(old_frame); cvtColor(old_frame,old_gray,COLOR_BGR2GRAY); goodFeaturesToTrack(old_gray,featurePoints,maxCorners,qualityLevel,minDistance,Mat(),blockSize,useHarrisDetector,k);
特征點(diǎn)繪制
voiddraw_goodFeatures(Mat&image,vectorgoodFeatures){ for(size_tt=0;t
KLT跟蹤代碼如下
TermCriteriacriteria=TermCriteria(TermCriteria::COUNT+TermCriteria::EPS,30,0.01); doublederivlambda=0.5; intflags=0; boolret=capture.read(frame); if(!ret)break; imshow("frame",frame); roi.x=0; frame.copyTo(result(roi)); cvtColor(frame,gray,COLOR_BGR2GRAY); //calculateopticalflow calcOpticalFlowPyrLK(old_gray,gray,pts[0],pts[1],status,err,Size(31,31),3,criteria,derivlambda,flags);
特征點(diǎn)狀態(tài)檢查與匹配的代碼如下
size_ti,k; for(i=k=0;i2){ pts[0][k]=pts[0][i]; initPoints[k]=initPoints[i]; pts[1][k++]=pts[1][i]; circle(frame,pts[1][i],3,Scalar(0,255,0),-1,8); } } //resize有用特征點(diǎn) pts[1].resize(k); pts[0].resize(k); initPoints.resize(k);
繪制跟蹤軌跡的代碼如下
//繪制跟蹤軌跡 draw_lines(frame,initPoints,pts[1]);
該方法實(shí)現(xiàn)如下:
voiddraw_lines(Mat&image,vectorpt1,vector pt2){ if(color_lut.size()
運(yùn)行效果:
左側(cè)是視頻的原始每一幀、右側(cè)視頻是每一幀中KLT算法實(shí)時(shí)軌跡繪制
車輛運(yùn)行軌跡跟蹤
審核編輯:劉清
-
跟蹤算法
+關(guān)注
關(guān)注
0文章
40瀏覽量
13000 -
OpenCV
+關(guān)注
關(guān)注
29文章
625瀏覽量
41215 -
KLT
+關(guān)注
關(guān)注
0文章
5瀏覽量
7447
原文標(biāo)題:干貨 | OpenCV中KLT光流跟蹤原理詳解與代碼演示
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論