Opencv光流運動物體追蹤詳解
光流的概念是由一個叫Gibson的哥們在1950年提出來的。它描述是空間運動物體在觀察成像平面上的像素運動的瞬時速度,利用圖像序列中像素在時間域上的變化以及相鄰幀之間的相關性來找到上一幀跟當前幀之間存在的對應關系,從而計算出相鄰幀之間物體的運動信息的一種方法。那么所說的光流到底是什么?
簡單來說,上圖表現的就是光流,光流描述的是圖像上每個像素點的灰度的位置(速度)變化情況,光流的研究是利用圖像序列中的像素強度數據的時域變化和相關性來確定各自像素位置的“運動”。研究光流場的目的就是為了從圖片序列中近似得到不能直接得到的運動場。
光流法的前提假設:
(1)相鄰幀之間的亮度恒定;
(2)相鄰視頻幀的取幀時間連續(xù),或者,相鄰幀之間物體的運動比較“微小”;
(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:
視頻流跟蹤:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持我們。
您可能感興趣的文章
- 01-10實現opencv圖像裁剪分屏顯示示例
- 01-10使用opencv拉伸圖像擴大分辨率示例
- 01-10基于C++實現kinect+opencv 獲取深度及彩色數據
- 01-10C/C++實現貪吃蛇逐步運動效果
- 01-10淺談CMake配置OpenCV 時靜態(tài)鏈接與動態(tài)鏈接的選擇
- 01-10OpenCV中C++函數imread讀取圖片的問題及解決方法
- 01-10visual studio 2013中配置opencv圖文教程 Opencv2.4.9安裝配置教程
- 01-10OPENCV批量讀取圖片實現方法
- 01-10Opencv學習教程之漫水填充算法實例詳解
- 01-10Opencv基于CamShift算法實現目標跟蹤


閱讀排行
本欄相關
- 04-02c語言函數調用后清空內存 c語言調用
- 04-02func函數+在C語言 func函數在c語言中
- 04-02c語言的正則匹配函數 c語言正則表達
- 04-02c語言用函數寫分段 用c語言表示分段
- 04-02c語言中對數函數的表達式 c語言中對
- 04-02c語言編寫函數冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數 round c語言
- 04-02c語言分段函數怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數 c語言中怎
- 04-02c語言調用函數求fibo C語言調用函數求
隨機閱讀
- 01-10C#中split用法實例總結
- 01-11ajax實現頁面的局部加載
- 01-10delphi制作wav文件的方法
- 08-05dedecms(織夢)副欄目數量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 04-02jquery與jsp,用jquery
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文