1. // Lucas-Kanade method Optical Flow in OpenCV
  2. // BJTShang, 2016-12-13
  3.  
  4. #include <cv.h>
  5. #include <cxcore.h>
  6. #include <highgui.h>
  7.  
  8. const int MAX_CORNERS = 500;
  9.  
  10. int main(int argc, char** argv){
  11. IplImage* imgA = cvLoadImage("/home/bjtshang/cpp_ws/opencv/data/OpticalFlow0.jpg",
  12. CV_LOAD_IMAGE_GRAYSCALE);
  13. IplImage* imgB = cvLoadImage("/home/bjtshang/cpp_ws/opencv/data/OpticalFlow1.jpg",
  14. CV_LOAD_IMAGE_GRAYSCALE);
  15.  
  16. // image to show the optical flow vectors
  17. IplImage* imgC = cvLoadImage("/home/bjtshang/Desktop/OpticalFlow1.jpg",
  18. CV_LOAD_IMAGE_UNCHANGED);
  19.  
  20. CvSize img_size = cvGetSize(imgA);
  21. CvSize win_size = cvSize(50, 50);
  22. int corner_count = MAX_CORNERS;
  23.  
  24. // get the features (detect corners) need to be tracked
  25. IplImage* imgEig = cvCreateImage(img_size, IPL_DEPTH_32F, 1);
  26. IplImage* imgTmp = cvCreateImage(img_size, IPL_DEPTH_32F, 1);
  27.  
  28. CvPoint2D32f* cornersA = new CvPoint2D32f[corner_count];
  29.  
  30. cvGoodFeaturesToTrack(imgA, imgEig, imgTmp, cornersA, &corner_count,
  31. 0.02, 8.0, 0, 3, 0, 0.04);
  32.  
  33. // find sub-pixel corners
  34. cvFindCornerSubPix(imgA, cornersA, corner_count,
  35. win_size, cvSize(-1,-1),
  36. cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.1));
  37.  
  38. char features_found[MAX_CORNERS];
  39. float feature_errors[MAX_CORNERS];
  40.  
  41. CvSize pyr_size = cvSize(imgA->width+8, imgB->height/3);
  42.  
  43. IplImage* pyrA = cvCreateImage(pyr_size, IPL_DEPTH_32F, 1);
  44. IplImage* pyrB = cvCreateImage(pyr_size, IPL_DEPTH_32F, 1);
  45.  
  46. CvPoint2D32f* cornersB = new CvPoint2D32f[MAX_CORNERS];
  47.  
  48. cvCalcOpticalFlowPyrLK(imgA, imgB, pyrA, pyrB, cornersA, cornersB,
  49. corner_count, win_size,
  50. 10, features_found, feature_errors,
  51. cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20, 0.1),
  52. 0
  53. );
  54.  
  55. for(int i=0; i<corner_count; i++){
  56. if(features_found[i]==0 || feature_errors[i] > 550){
  57. printf("Error is: %f\n", feature_errors[i]);
  58. continue;
  59. }
  60. //printf("Got it\n");
  61. CvPoint p1 = cvPoint(cvRound(cornersA[i].x), cvRound(cornersA[i].y));
  62. CvPoint p2 = cvPoint(cvRound(cornersB[i].x), cvRound(cornersB[i].y));
  63. cvLine(imgC, p1, p2, CV_RGB(255, 0, 0), 1);
  64. }
  65. cvNamedWindow("imgA", 0);
  66. cvNamedWindow("imgB", 0);
  67. cvNamedWindow("Optical_flow", 0);
  68. cvShowImage("imgA", imgA);
  69. cvShowImage("imgB", imgB);
  70. cvShowImage("Optical_flow", imgC);
  71.  
  72. cvWaitKey(0);
  73. return 0;
  74. }

  

金字塔Lucas-Kanande光流算法实现的更多相关文章

  1. Lucas–Kanade光流算法学习

    Lucas–Kanade光流算法是一种两帧差分的光流估计算法.它由Bruce D. Lucas 和 Takeo Kanade提出.         光流(Optical flow or optic f ...

  2. 光流算法:Brox算法(转载)

    参考论文:1. High Accuracy Optical Flow Estimation Based on a Theory for Warping, Thomas Box, ECCV20042. ...

  3. 光流算法:Brox算法

    参考论文:1. High Accuracy Optical Flow Estimation Based on a Theory for Warping, Thomas Box, ECCV20042. ...

  4. LK光流算法:提高计算精度和增加搜索范围

    LK光流算法:提高计算精度和增加搜索范围 关于LK算法的基本理论,见:http://www.cnblogs.com/dzyBK/p/4960630.html 这里主要阐述如何提高LK算法的计算精度和在 ...

  5. 光流算法:关于OpenCV读写middlebury网站给定的光流的代码

    Middlebury是每个研究光流算法的人不可能不使用的网站,Middlebury提供了许多标准的测试库,这极大地推进了光流算法的进展.Middlebury提供的标准库,其计算出的光流保存在后缀名为. ...

  6. 光流算法:Brox光流的OpenCV源码解析

    OpenCV中DeepFlow代码其实是Brox光流,而非真正的DeepFlow光流,在将近一个月的研究.移植及优化过程中,对Brox光流有了较深刻的认识.我对OpenCV中源码进行了详细的分析,并以 ...

  7. LK光流算法的三个假设

    在实际过程中采用 Lucas-Kanade 光流算法跟踪运动物体特征点的时候,一个很明显的特点是LK算法(包括其他光流算法)不能计算"大运动",加上金子塔的方法稍微好点. 这是什么 ...

  8. cvCalcOpticalFlowPyrLK的使用--基于高斯金字塔的稀疏光流特征集求解

    void cvCalcOpticalFlowPyrLK( const CvArr* prev, const CvArr* curr, CvArr* prev_pyr, CvArr* curr_pyr, ...

  9. 优化梯度计算的改进的HS光流算法

    前言 在经典HS光流算法中,图像中两点间的灰度变化被假定为线性的,但实际上灰度变化是非线性的.本文详细分析了灰度估计不准确造成的偏差并提出了一种改进HS光流算法,这种算法可以得到较好的计算结果,并能明 ...

随机推荐

  1. 怎么在GitHub上寻找开源项目呢

    find projects GitHub Explore: Popular and trending projects. GitHub Stars: Projects starred by other ...

  2. VS 生成事件

    转载自: http://hi.baidu.com/gisince/item/7f0439ee610c94255a2d64b4 今天写了生成事件的处理,如下: 从网上Down了一个例子,运行时提示错误 ...

  3. 索引超出了数组界限(Microsoft.SqlServer.Smo)

    SSMS连接远程SQL Server服务器是很方便的. 昨天我用SQL Server 2008 SSMS连接SQL Server 2012竟然报错,如下图: 在网上搜了,参考这个参考那个,太啰嗦了,确 ...

  4. [LeetCode] Excel Sheet Column Number 求Excel表列序号

    Related to question Excel Sheet Column Title Given a column title as appear in an Excel sheet, retur ...

  5. angular js 在ie11 下的get请求缓存问题的解决办法

    使用angularjs 1.x开发的应用在ie11 下回碰到各种怪异的情况:一般表现在:卡,慢,丑. 还有另外一种情况,就是:get请求被缓存,导致页面数据没有刷新.今天我们就来解决这个问题. 几行代 ...

  6. RandHelper

    /// <summary> /// 类说明:RandHelper类,用来实现取随机 /// 编码日期:2015-12-29 /// 编 码 人:里程碑 /// 修改日期:2015-12-2 ...

  7. Jenkins插件安装和系统配置

    前面我们只是把Jenkins部署在Tomcat中了,下面来看看Jenkins中的插件和一些基础的系统配置. 1.用户管理 我们一般的项目组肯定是由多名成员组成的,如何向Jenkins添加我们的成员呢? ...

  8. vue.js 第五课

    计算属性 1.基础例子 2.计算属性 vs $watch 3.计算 setter 4.计算属性开发实务demo   1.计算属性 computed( 电脑computer) (区别普通属性) 计算属性 ...

  9. 第一次源码分析: 图片加载框架Picasso源码分析

    使用: Picasso.with(this) .load("http://imgstore.cdn.sogou.com/app/a/100540002/467502.jpg") . ...

  10. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...