Opencv光流運(yùn)動(dòng)物體追蹤詳解
光流的概念是由一個(gè)叫Gibson的哥們?cè)?950年提出來(lái)的。它描述是空間運(yùn)動(dòng)物體在觀察成像平面上的像素運(yùn)動(dòng)的瞬時(shí)速度,利用圖像序列中像素在時(shí)間域上的變化以及相鄰幀之間的相關(guān)性來(lái)找到上一幀跟當(dāng)前幀之間存在的對(duì)應(yīng)關(guān)系,從而計(jì)算出相鄰幀之間物體的運(yùn)動(dòng)信息的一種方法。那么所說(shuō)的光流到底是什么?
簡(jiǎn)單來(lái)說(shuō),上圖表現(xiàn)的就是光流,光流描述的是圖像上每個(gè)像素點(diǎn)的灰度的位置(速度)變化情況,光流的研究是利用圖像序列中的像素強(qiáng)度數(shù)據(jù)的時(shí)域變化和相關(guān)性來(lái)確定各自像素位置的“運(yùn)動(dòng)”。研究光流場(chǎng)的目的就是為了從圖片序列中近似得到不能直接得到的運(yùn)動(dòng)場(chǎng)。
光流法的前提假設(shè):
(1)相鄰幀之間的亮度恒定;
(2)相鄰視頻幀的取幀時(shí)間連續(xù),或者,相鄰幀之間物體的運(yùn)動(dòng)比較“微小”;
(3)保持空間一致性;即,同一子圖像的像素點(diǎn)具有相同的運(yùn)動(dòng);
Opencv中金字塔LK光流實(shí)現(xiàn):
#include "highgui/highgui.hpp" #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/video/tracking.hpp" #include <iostream> using namespace cv; using namespace std; Mat image1,image2; vector<Point2f> point1,point2,pointCopy; vector<uchar> status; vector<float> err; int main(int argc,char *argv[]) { VideoCapture video(argv[1]); double fps=video.get(CV_CAP_PROP_FPS); //獲取視頻幀率 double pauseTime=1000/fps; //兩幅畫面中間間隔 video>>image1; Mat image1Gray,image2Gray; cvtColor(image1,image1Gray,CV_RGB2GRAY); goodFeaturesToTrack(image1Gray,point1,100,0.01,10,Mat()); pointCopy=point1; for(int i=0;i<point1.size();i++) //繪制特征點(diǎn)位 { circle(image1,point1[i],1,Scalar(0,0,255),2); } namedWindow("角點(diǎn)特征光流",0); imshow("角點(diǎn)特征光流",image1); while(true) { video>>image2; if(!image2.data||waitKey(pauseTime)==27) //圖像為空或Esc鍵按下退出播放 { break; } cvtColor(image2,image2Gray,CV_RGB2GRAY); calcOpticalFlowPyrLK(image1Gray,image2Gray,point1,point2,status,err,Size(20,20),3); //LK金字塔 for(int i=0;i<point2.size();i++) { circle(image2,point2[i],1,Scalar(0,0,255),2); line(image2,pointCopy[i],point2[i],Scalar(255,0,0),2); } imshow("角點(diǎn)特征光流",image2); swap(point1,point2); image1Gray=image2Gray.clone(); } return 0; }
圖像跟蹤結(jié)果1:
圖像跟蹤結(jié)果2:
視頻流跟蹤:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于Turbo C(V2.0)編譯錯(cuò)誤信息的詳細(xì)介紹
本篇文章對(duì)Turbo C(V2.0)編譯的錯(cuò)誤信息進(jìn)行了詳細(xì)的介紹。需要的朋友參考下2013-05-05vc6.0中c語(yǔ)言控制臺(tái)程序中的定時(shí)技術(shù)(定時(shí)器)
這篇文章主要介紹了vc6.0中c語(yǔ)言控制臺(tái)程序中的定時(shí)技術(shù)(定時(shí)器),需要的朋友可以參考下2014-04-04用代碼和UML圖化解設(shè)計(jì)模式之橋接模式的深入分析
本篇文章是對(duì)橋接模式進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++ WideCharToMultiByte()函數(shù)案例詳解
這篇文章主要介紹了C++ WideCharToMultiByte()函數(shù)案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解
這篇文章主要為大家介紹了C++設(shè)計(jì)與實(shí)現(xiàn)ORM系統(tǒng)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09VSCode插件開發(fā)全攻略之package.json詳解
這篇文章主要介紹了VSCode插件開發(fā)全攻略之package.json的相關(guān)知識(shí),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12