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