1 
2 #include "opencv2/core/utility.hpp"
3 #include "opencv2/highgui.hpp"
4 #include "opencv2/imgproc.hpp"
5 #include "opencv2/videoio.hpp"
6 #include "opencv2/video.hpp"
7 
8 using namespace std;
9 using namespace cv;
10 
main(int argc,char ** argv)11 int main(int argc, char **argv)
12 {
13     CommandLineParser parser(argc, argv, "{ @video  | vtest.avi  | use video as input }");
14     string filename = samples::findFileOrKeep(parser.get<string>("@video"));
15 
16     VideoCapture cap;
17     cap.open(filename);
18 
19     if(!cap.isOpened())
20     {
21         printf("ERROR: Cannot open file %s\n", filename.c_str());
22         parser.printMessage();
23         return -1;
24     }
25 
26     Mat prevgray, gray, rgb, frame;
27     Mat flow, flow_uv[2];
28     Mat mag, ang;
29     Mat hsv_split[3], hsv;
30     char ret;
31 
32     Ptr<DenseOpticalFlow> algorithm = DISOpticalFlow::create(DISOpticalFlow::PRESET_MEDIUM);
33 
34     while(true)
35     {
36         cap >> frame;
37         if (frame.empty())
38             break;
39 
40         cvtColor(frame, gray, COLOR_BGR2GRAY);
41 
42         if (!prevgray.empty())
43         {
44             algorithm->calc(prevgray, gray, flow);
45             split(flow, flow_uv);
46             multiply(flow_uv[1], -1, flow_uv[1]);
47             cartToPolar(flow_uv[0], flow_uv[1], mag, ang, true);
48             normalize(mag, mag, 0, 1, NORM_MINMAX);
49             hsv_split[0] = ang;
50             hsv_split[1] = mag;
51             hsv_split[2] = Mat::ones(ang.size(), ang.type());
52             merge(hsv_split, 3, hsv);
53             cvtColor(hsv, rgb, COLOR_HSV2BGR);
54             imshow("flow", rgb);
55             imshow("orig", frame);
56         }
57 
58         if ((ret = (char)waitKey(20)) > 0)
59             break;
60         std::swap(prevgray, gray);
61     }
62 
63     return 0;
64 }
65