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