Blame view

3rdparty/opencv-4.5.4/samples/cpp/fback.cpp 1.79 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
  #include "opencv2/video/tracking.hpp"
  #include "opencv2/imgproc.hpp"
  #include "opencv2/videoio.hpp"
  #include "opencv2/highgui.hpp"
  
  #include <iostream>
  
  using namespace cv;
  using namespace std;
  
  static void help(char** argv)
  {
      cout <<
              "\nThis program demonstrates dense optical flow algorithm by Gunnar Farneback\n"
              "Mainly the function: calcOpticalFlowFarneback()\n"
              "Call:\n"
          <<  argv[0]
          <<  "This reads from video camera 0\n" << endl;
  }
  static void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step,
                      double, const Scalar& color)
  {
      for(int y = 0; y < cflowmap.rows; y += step)
          for(int x = 0; x < cflowmap.cols; x += step)
          {
              const Point2f& fxy = flow.at<Point2f>(y, x);
              line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)),
                   color);
              circle(cflowmap, Point(x,y), 2, color, -1);
          }
  }
  
  int main(int argc, char** argv)
  {
      cv::CommandLineParser parser(argc, argv, "{help h||}");
      if (parser.has("help"))
      {
          help(argv);
          return 0;
      }
      VideoCapture cap(0);
      help(argv);
      if( !cap.isOpened() )
          return -1;
  
      Mat flow, cflow, frame;
      UMat gray, prevgray, uflow;
      namedWindow("flow", 1);
  
      for(;;)
      {
          cap >> frame;
          cvtColor(frame, gray, COLOR_BGR2GRAY);
  
          if( !prevgray.empty() )
          {
              calcOpticalFlowFarneback(prevgray, gray, uflow, 0.5, 3, 15, 3, 5, 1.2, 0);
              cvtColor(prevgray, cflow, COLOR_GRAY2BGR);
              uflow.copyTo(flow);
              drawOptFlowMap(flow, cflow, 16, 1.5, Scalar(0, 255, 0));
              imshow("flow", cflow);
          }
          if(waitKey(30)>=0)
              break;
          std::swap(prevgray, gray);
      }
      return 0;
  }