光流的概念是由一个叫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:

视频流跟踪:

最新文章

  1. 关于 DataGridTextColumn的IsReadOnly
  2. 包管理工具Carthage使用
  3. Plugins
  4. Swift字符串类型
  5. IE 下使用firebug
  6. Hbuilder开发移动App(1)
  7. gulp静态资源构建、压缩、版本号添加
  8. one 策略模式 strategy
  9. ACM 排列2
  10. 第一周java学习总结
  11. Node.js(day6)
  12. md5加密utils
  13. webpack打包vue --&gt;简易讲解
  14. [leetcode]272. Closest Binary Search Tree Value II二叉搜索树中最近的值2
  15. fail2ban 防爆破,防止CC 攻击
  16. pp 总结二
  17. thinkphp5中使用PHPExcel(转载)
  18. 笔记本 原来win10系统改装win7系统遇到 invaid signature detected.check secure boot policy setup问题
  19. 第二十四节:Java语言基础-讲解数组的综合应用
  20. git如何修改用户名和邮箱名?

热门文章

  1. 1.1selenium 介绍
  2. 原生js大总结九
  3. 【河南省多校脸萌第六场 B】点兵点将
  4. datagridview合并相同单元格
  5. spark算子(二)
  6. Altium Designer四层板起步
  7. 3.Docker安装【Docker每天5分钟】
  8. html实现返回上一页的几种方法(javaScript:history.go(-1);)
  9. 利用iTextSharp组件给PDF文档添加图片水印,文字水印
  10. context.getSystemService的简单说明