Advertisement
Guest User

opticalflow3

a guest
Nov 24th, 2014
172
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.92 KB | None | 0 0
  1. #include <cv.h>
  2. #include <highgui.h>
  3. #include "opencv2/legacy/legacy.hpp"
  4. #include <iostream>
  5. #include <opencv2/core/core.hpp>
  6. #include <opencv2/highgui/highgui.hpp>
  7.  
  8. int
  9. main (int argc, char **argv)
  10. {
  11.   char *status;
  12.   int i, corner_count = 150;
  13.   CvPoint2D32f *corners1, *corners2;
  14.   CvTermCriteria criteria;
  15.   IplImage *src_img1, *src_img2, *dst_img;
  16.   IplImage *eig_img, *temp_img;
  17.   IplImage *prev_pyramid, *curr_pyramid;
  18.  
  19.   if (argc != 4 ||
  20.       (src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_GRAYSCALE)) == 0 ||
  21.       (src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_GRAYSCALE)) == 0)
  22.     return -1;
  23.  
  24.   dst_img = cvLoadImage (argv[2], CV_LOAD_IMAGE_COLOR);
  25.    
  26.     cv::Mat white_img(cv::Size(640, 480), CV_8UC3, cv::Scalar::all(255));
  27.    
  28.   // (1)必要な構造体の確保
  29.   eig_img = cvCreateImage (cvGetSize (src_img1), IPL_DEPTH_32F, 1);
  30.   temp_img = cvCreateImage (cvGetSize (src_img1), IPL_DEPTH_32F, 1);
  31.   corners1 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
  32.   corners2 = (CvPoint2D32f *) cvAlloc (corner_count * sizeof (CvPoint2D32f));
  33.   prev_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);
  34.   curr_pyramid = cvCreateImage (cvSize (src_img1->width + 8, src_img1->height / 3), IPL_DEPTH_8U, 1);
  35.   status = (char *) cvAlloc (corner_count);
  36.   criteria = cvTermCriteria (CV_TERMCRIT_ITER | CV_TERMCRIT_EPS, 64, 0.01);
  37.  
  38.   // (2)疎な特徴点を検出
  39.   cvGoodFeaturesToTrack (src_img1, eig_img, temp_img, corners1, &corner_count, 0.001, 5, NULL);
  40.  
  41.   // (3)オプティカルフローを計算
  42.   cvCalcOpticalFlowPyrLK (src_img1, src_img2, prev_pyramid, curr_pyramid,
  43.                           corners1, corners2, corner_count, cvSize (10, 10), 4, status, NULL, criteria, 0);
  44.  
  45.   // (4)計算されたフローを描画
  46.  /* for (i = 0; i < corner_count; i++) {
  47.     if (status[i])
  48.       cvLine (white_img, cvPointFrom32f (corners1[i]), cvPointFrom32f (corners2[i]), CV_RGB (255, 0, 0), 1, CV_AA, 0);
  49.   }
  50.   cvNamedWindow ("Image", 1);
  51.   cv::imshow ("Image", white_img);
  52.   cvWaitKey (0)
  53. */
  54.   // (4)計算されたフローを描画
  55.  
  56.   for (i = 0; i < corner_count; i++) {
  57.     if (status[i])
  58.  
  59.      cv::line(white_img, cv::Point(corners1[i]), cv::Point(corners2[i]), cv::Scalar(255, 0, 0), 10, CV_AA);
  60.      //cvLine (white_img, cvPointFrom32f (corners1[i]), cvPointFrom32f (corners2[i]), CV_RGB (255, 0, 0), 1, CV_AA, 0);
  61.  
  62. }
  63.   cvNamedWindow ("Image", 1);
  64.   cvShowImage ("Image", white_img);
  65.   //cv::imwrite(argv[3],white_img);
  66.   cv::imshow ("Image", white_img);
  67.   cvWaitKey (0);
  68.  
  69.   cvDestroyWindow ("Image");
  70.   cvReleaseImage (&src_img1);
  71.   cvReleaseImage (&src_img2);
  72.   cvReleaseImage (&dst_img);
  73.   cvReleaseImage (&eig_img);
  74.   cvReleaseImage (&temp_img);
  75.   //cvReleaseImage (&white_img);
  76.   cvReleaseImage (&prev_pyramid);
  77.   cvReleaseImage (&curr_pyramid);
  78.  
  79.   //imwrite(argv[3],white_img);
  80.   cvSaveImage(argv[3],white_img);
  81.   return 0;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement