/src/Chapter10/OpticalFlow.cpp

https://github.com/yourtion/LearningOpenCV · C++ · 96 lines · 70 code · 19 blank · 7 comment · 2 complexity · ed887f356af835c18a0e8cdcff96eb03 MD5 · raw file

  1. //
  2. // OpticalFlow.cpp
  3. // LearningOpenCV
  4. //
  5. // Created by YourtionGuo on 7/28/16.
  6. // Copyright © 2016 Yourtion. All rights reserved.
  7. //
  8. #include <iostream>
  9. #include <highgui.h>
  10. #include <cv.h>
  11. #define CVX_RED CV_RGB( 0xff, 0x00, 0x00 )
  12. #define CVX_BLUE CV_RGB( 0x00, 0x00, 0xff )
  13. #define CVX_GREEN CV_RGB( 0x00, 0xff, 0x00 )
  14. const int MAX_CORNERS = 500;
  15. int main(int argc, const char * argv[]) {
  16. IplImage* imgA = cvLoadImage( "data/OpticalFlow0.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  17. IplImage* imgB = cvLoadImage( "data/OpticalFlow1.jpg", CV_LOAD_IMAGE_GRAYSCALE );
  18. CvSize img_sz = cvGetSize( imgA );
  19. int win_size = 10;
  20. IplImage* imgC = cvLoadImage( "data/OpticalFlow1.jpg", CV_LOAD_IMAGE_UNCHANGED );
  21. IplImage* image_eig = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
  22. IplImage* image_tmp = cvCreateImage( img_sz, IPL_DEPTH_32F, 1 );
  23. int corner_count = MAX_CORNERS;
  24. CvPoint2D32f* cornersA = new CvPoint2D32f[ MAX_CORNERS ];
  25. CvPoint2D32f* cornersB = new CvPoint2D32f[ MAX_CORNERS ];
  26. cvGoodFeaturesToTrack( imgA, image_eig, image_tmp, cornersA, &corner_count, 0.01, 5.0, 0, 3, 0, 0.04 );
  27. cvFindCornerSubPix(
  28. imgA,
  29. cornersA,
  30. corner_count,
  31. cvSize(win_size, win_size),
  32. cvSize(-1, -1),
  33. cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20.0, 0.03)
  34. );
  35. char features_found[ MAX_CORNERS ];
  36. float feature_errors[ MAX_CORNERS ];
  37. CvSize pyr_sz = cvSize( imgA->width+8, imgB->height/3 );
  38. IplImage* pyrA = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
  39. IplImage* pyrB = cvCreateImage( pyr_sz, IPL_DEPTH_32F, 1 );
  40. cvCalcOpticalFlowPyrLK(imgA,
  41. imgB,
  42. pyrA,
  43. pyrB,
  44. cornersA,
  45. cornersB,
  46. corner_count,
  47. cvSize(win_size, win_size),
  48. 5,
  49. features_found,
  50. feature_errors,
  51. cvTermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 20.0, 0.3),
  52. 0
  53. );
  54. for( int i=0; i<corner_count; i++ ) {
  55. if( features_found[i]==0|| feature_errors[i]>550 ) {
  56. printf("Error is %f\n",feature_errors[i]);
  57. continue;
  58. }
  59. CvPoint p0 = cvPoint(
  60. cvRound( cornersA[i].x ),
  61. cvRound( cornersA[i].y )
  62. );
  63. CvPoint p1 = cvPoint(
  64. cvRound( cornersB[i].x ),
  65. cvRound( cornersB[i].y )
  66. );
  67. cvLine( imgC, p0, p1, CV_RGB(255,0,0),2 );
  68. }
  69. cvNamedWindow("ImageA",0);
  70. cvNamedWindow("ImageB",0);
  71. cvNamedWindow("LKpyr_OpticalFlow",0);
  72. cvShowImage("ImageA",imgA);
  73. cvShowImage("ImageB",imgB);
  74. cvShowImage("LKpyr_OpticalFlow",imgC);
  75. cvWaitKey(0);
  76. return 0;
  77. }