Merge remote-tracking branch 'origin/2.4' into merge-2.4
[platform/upstream/opencv.git] / samples / gpu / bgfg_segm.cpp
1 #include <iostream>
2 #include <string>
3
4 #include "opencv2/core.hpp"
5 #include "opencv2/core/utility.hpp"
6 #include "opencv2/cudabgsegm.hpp"
7 #include "opencv2/video.hpp"
8 #include "opencv2/highgui.hpp"
9
10 using namespace std;
11 using namespace cv;
12 using namespace cv::cuda;
13
14 enum Method
15 {
16     MOG,
17     MOG2,
18     GMG,
19     FGD_STAT
20 };
21
22 int main(int argc, const char** argv)
23 {
24     cv::CommandLineParser cmd(argc, argv,
25         "{ c camera |             | use camera }"
26         "{ f file   | 768x576.avi | input video file }"
27         "{ m method | mog         | method (mog, mog2, gmg, fgd) }"
28         "{ h help   |             | print help message }");
29
30     if (cmd.has("help") || !cmd.check())
31     {
32         cmd.printMessage();
33         cmd.printErrors();
34         return 0;
35     }
36
37     bool useCamera = cmd.has("camera");
38     string file = cmd.get<string>("file");
39     string method = cmd.get<string>("method");
40
41     if (method != "mog"
42         && method != "mog2"
43         && method != "gmg"
44         && method != "fgd")
45     {
46         cerr << "Incorrect method" << endl;
47         return -1;
48     }
49
50     Method m = method == "mog" ? MOG :
51                method == "mog2" ? MOG2 :
52                method == "fgd" ? FGD_STAT :
53                                   GMG;
54
55     VideoCapture cap;
56
57     if (useCamera)
58         cap.open(0);
59     else
60         cap.open(file);
61
62     if (!cap.isOpened())
63     {
64         cerr << "can not open camera or video file" << endl;
65         return -1;
66     }
67
68     Mat frame;
69     cap >> frame;
70
71     GpuMat d_frame(frame);
72
73     Ptr<BackgroundSubtractor> mog = cuda::createBackgroundSubtractorMOG();
74     Ptr<BackgroundSubtractor> mog2 = cuda::createBackgroundSubtractorMOG2();
75     Ptr<BackgroundSubtractor> gmg = cuda::createBackgroundSubtractorGMG(40);
76     Ptr<BackgroundSubtractor> fgd = cuda::createBackgroundSubtractorFGD();
77
78     GpuMat d_fgmask;
79     GpuMat d_fgimg;
80     GpuMat d_bgimg;
81
82     Mat fgmask;
83     Mat fgimg;
84     Mat bgimg;
85
86     switch (m)
87     {
88     case MOG:
89         mog->apply(d_frame, d_fgmask, 0.01);
90         break;
91
92     case MOG2:
93         mog2->apply(d_frame, d_fgmask);
94         break;
95
96     case GMG:
97         gmg->apply(d_frame, d_fgmask);
98         break;
99
100     case FGD_STAT:
101         fgd->apply(d_frame, d_fgmask);
102         break;
103     }
104
105     namedWindow("image", WINDOW_NORMAL);
106     namedWindow("foreground mask", WINDOW_NORMAL);
107     namedWindow("foreground image", WINDOW_NORMAL);
108     if (m != GMG)
109     {
110         namedWindow("mean background image", WINDOW_NORMAL);
111     }
112
113     for(;;)
114     {
115         cap >> frame;
116         if (frame.empty())
117             break;
118         d_frame.upload(frame);
119
120         int64 start = cv::getTickCount();
121
122         //update the model
123         switch (m)
124         {
125         case MOG:
126             mog->apply(d_frame, d_fgmask, 0.01);
127             mog->getBackgroundImage(d_bgimg);
128             break;
129
130         case MOG2:
131             mog2->apply(d_frame, d_fgmask);
132             mog2->getBackgroundImage(d_bgimg);
133             break;
134
135         case GMG:
136             gmg->apply(d_frame, d_fgmask);
137             break;
138
139         case FGD_STAT:
140             fgd->apply(d_frame, d_fgmask);
141             fgd->getBackgroundImage(d_bgimg);
142             break;
143         }
144
145         double fps = cv::getTickFrequency() / (cv::getTickCount() - start);
146         std::cout << "FPS : " << fps << std::endl;
147
148         d_fgimg.create(d_frame.size(), d_frame.type());
149         d_fgimg.setTo(Scalar::all(0));
150         d_frame.copyTo(d_fgimg, d_fgmask);
151
152         d_fgmask.download(fgmask);
153         d_fgimg.download(fgimg);
154         if (!d_bgimg.empty())
155             d_bgimg.download(bgimg);
156
157         imshow("image", frame);
158         imshow("foreground mask", fgmask);
159         imshow("foreground image", fgimg);
160         if (!bgimg.empty())
161             imshow("mean background image", bgimg);
162
163         int key = waitKey(30);
164         if (key == 27)
165             break;
166     }
167
168     return 0;
169 }