Merge pull request #1663 from vpisarev:ocl_experiments3
[profile/ivi/opencv.git] / samples / ocl / bgfg_segm.cpp
1 #include <iostream>
2 #include <string>
3
4 #include "opencv2/core.hpp"
5 #include "opencv2/core/utility.hpp"
6 #include "opencv2/ocl.hpp"
7 #include "opencv2/highgui.hpp"
8
9 using namespace std;
10 using namespace cv;
11 using namespace cv::ocl;
12
13 #define M_MOG  1
14 #define M_MOG2 2
15
16 int main(int argc, const char** argv)
17 {
18
19     cv::CommandLineParser cmd(argc, argv,
20         "{ c camera | false       | use camera }"
21         "{ f file   | 768x576.avi | input video file }"
22         "{ m method | mog         | method (mog, mog2) }"
23         "{ h help   | false       | print help message }");
24
25     if (cmd.get<bool>("help"))
26     {
27         cout << "Usage : bgfg_segm [options]" << endl;
28         cout << "Available options:" << endl;
29         cmd.printMessage();
30         return 0;
31     }
32
33     bool useCamera = cmd.get<bool>("camera");
34     string file = cmd.get<string>("file");
35     string method = cmd.get<string>("method");
36
37     if (method != "mog" && method != "mog2")
38     {
39         cerr << "Incorrect method" << endl;
40         return -1;
41     }
42
43     int m = method == "mog" ? M_MOG : M_MOG2;
44
45     VideoCapture cap;
46
47     if (useCamera)
48         cap.open(0);
49     else
50         cap.open(file);
51
52     if (!cap.isOpened())
53     {
54         cerr << "can not open camera or video file" << endl;
55         return -1;
56     }
57
58     Mat frame;
59     cap >> frame;
60
61     oclMat d_frame(frame);
62
63     cv::ocl::MOG mog;
64     cv::ocl::MOG2 mog2;
65
66     oclMat d_fgmask;
67     oclMat d_fgimg;
68     oclMat d_bgimg;
69
70     d_fgimg.create(d_frame.size(), d_frame.type());
71
72     Mat fgmask;
73     Mat fgimg;
74     Mat bgimg;
75
76     switch (m)
77     {
78     case M_MOG:
79         mog(d_frame, d_fgmask, 0.01f);
80         break;
81
82     case M_MOG2:
83         mog2(d_frame, d_fgmask);
84         break;
85     }
86
87     for(;;)
88     {
89         cap >> frame;
90         if (frame.empty())
91             break;
92         d_frame.upload(frame);
93
94         int64 start = cv::getTickCount();
95
96         //update the model
97         switch (m)
98         {
99         case M_MOG:
100             mog(d_frame, d_fgmask, 0.01f);
101             mog.getBackgroundImage(d_bgimg);
102             break;
103
104         case M_MOG2:
105             mog2(d_frame, d_fgmask);
106             mog2.getBackgroundImage(d_bgimg);
107             break;
108         }
109
110         double fps = cv::getTickFrequency() / (cv::getTickCount() - start);
111         std::cout << "FPS : " << fps << std::endl;
112
113         d_fgimg.setTo(Scalar::all(0));
114         d_frame.copyTo(d_fgimg, d_fgmask);
115
116         d_fgmask.download(fgmask);
117         d_fgimg.download(fgimg);
118         if (!d_bgimg.empty())
119             d_bgimg.download(bgimg);
120
121         imshow("image", frame);
122         imshow("foreground mask", fgmask);
123         imshow("foreground image", fgimg);
124         if (!bgimg.empty())
125             imshow("mean background image", bgimg);
126
127         int key = waitKey(30);
128         if (key == 27)
129             break;
130     }
131
132     return 0;
133 }