小編給大家分享一下Opencv光流運動物體追蹤的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
光流的概念是由一個叫Gibson的哥們在1950年提出來的。它描述是空間運動物體在觀察成像平面上的像素運動的瞬時速度,利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關系,從而計算出相鄰幀之間物體的運動信息的一種方法。那么所說的光流到底是什么?

簡單來說,上圖表現的就是光流,光流描述的是圖像上每個像素點的灰度的位置(速度)變化情況,光流的研究是利用圖像序列中的像素強度數據的時域變化和相關性來確定各自像素位置的“運動”。研究光流場的目的就是為了從圖片序列中近似得到不能直接得到的運動場。
光流法的前提假設:
(1)相鄰幀之間的亮度恒定;
(2)相鄰視頻幀的取幀時間連續,或者,相鄰幀之間物體的運動比較“微小”;
(3)保持空間一致性;即,同一子圖像的像素點具有相同的運動;
Opencv中金字塔LK光流實現:
#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++) //繪制特征點位
{
circle(image1,point1[i],1,Scalar(0,0,255),2);
}
namedWindow("角點特征光流",0);
imshow("角點特征光流",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("角點特征光流",image2);
swap(point1,point2);
image1Gray=image2Gray.clone();
}
return 0;
}圖像跟蹤結果1:

圖像跟蹤結果2:

視頻流跟蹤:

以上是“Opencv光流運動物體追蹤的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。