1 |
|
2 |
|
3 |
|
4 | #include "stdafx.h"
|
5 |
|
6 |
|
7 | #include <opencv.hpp>
|
8 |
|
9 | #ifdef _DEBUG
|
10 | #pragma comment (lib, "opencv_highgui248d.lib")
|
11 | #pragma comment (lib, "opencv_imgproc248d.lib")
|
12 | #pragma comment (lib, "opencv_core248d.lib")
|
13 | #pragma comment (lib, "opencv_calib3d248d.lib")
|
14 | #pragma comment (lib, "opencv_features2d248d.lib")
|
15 | #pragma comment (lib, "opencv_ocl248d.lib")
|
16 | #pragma comment (lib, "opencv_video248d.lib")
|
17 |
|
18 | #else
|
19 | #pragma comment (lib, "opencv_core248.lib")
|
20 | #pragma comment (lib, "opencv_imgproc248.lib")
|
21 | #pragma comment (lib, "opencv_highgui248.lib")
|
22 | #pragma comment (lib, "opencv_calib3d248.lib")
|
23 | #pragma comment (lib, "opencv_ocl248.lib")
|
24 | #pragma comment (lib, "opencv_video248.lib")
|
25 | #endif
|
26 |
|
27 | #include <iostream>
|
28 | #include <string>
|
29 |
|
30 | #include "opencv2/core/core.hpp"
|
31 | #include "opencv2/ocl/ocl.hpp"
|
32 | #include "opencv2/highgui/highgui.hpp"
|
33 |
|
34 | using namespace std;
|
35 | using namespace cv;
|
36 | using namespace cv::ocl;
|
37 |
|
38 | #define M_MOG 1
|
39 | #define M_MOG2 2
|
40 |
|
41 | int main(int argc, const char** argv)
|
42 | {
|
43 | |
44 | "{ c | camera | false | use camera }"
|
45 | "{ f | file | 768x576.avi | input video file }"
|
46 | "{ m | method | mog | method (mog, mog2) }"
|
47 | "{ h | help | false | print help message }");
|
48 |
|
49 | if (cmd.get<bool>("help"))
|
50 | {
|
51 | cout << "Usage : bgfg_segm [options]" << endl;
|
52 | cout << "Available options:" << endl;
|
53 | cmd.printParams();
|
54 | return EXIT_SUCCESS;
|
55 | }*/
|
56 |
|
57 | bool useCamera = false;
|
58 | string file = "..\\768x576.avi";
|
59 | string method = "mog2";
|
60 |
|
61 | if (method != "mog" && method != "mog2")
|
62 | {
|
63 | cerr << "Incorrect method" << endl;
|
64 | return EXIT_FAILURE;
|
65 | }
|
66 |
|
67 | int m = method == "mog" ? M_MOG : M_MOG2;
|
68 |
|
69 | VideoCapture cap;
|
70 | if (useCamera)
|
71 | cap.open(0);
|
72 | else
|
73 | cap.open(file);
|
74 |
|
75 | if (!cap.isOpened())
|
76 | {
|
77 | cout << "can not open camera or video file" << endl;
|
78 | return EXIT_FAILURE;
|
79 | }
|
80 |
|
81 | Mat frame;
|
82 | cap >> frame;
|
83 |
|
84 | #define USE_OCL
|
85 | #ifdef USE_OCL
|
86 | oclMat d_frame(frame);
|
87 |
|
88 | cv::ocl::MOG mog;
|
89 | cv::ocl::MOG2 mog2;
|
90 |
|
91 | oclMat d_fgmask, d_fgimg, d_bgimg;
|
92 |
|
93 | d_fgimg.create(d_frame.size(), d_frame.type());
|
94 |
|
95 | Mat fgmask, fgimg, bgimg;
|
96 |
|
97 | switch (m)
|
98 | {
|
99 | case M_MOG:
|
100 | mog(d_frame, d_fgmask, 0.01f);
|
101 | break;
|
102 |
|
103 | case M_MOG2:
|
104 | mog2(d_frame, d_fgmask);
|
105 | break;
|
106 | }
|
107 | #else
|
108 |
|
109 | BackgroundSubtractorMOG mog;
|
110 | BackgroundSubtractorMOG2 mog2;
|
111 |
|
112 | Mat fgmask, fgimg, bgimg;
|
113 |
|
114 | switch (m)
|
115 | {
|
116 | case M_MOG:
|
117 | mog(frame, fgmask, 0.01f);
|
118 | break;
|
119 |
|
120 | case M_MOG2:
|
121 | mog2(frame, fgmask);
|
122 | break;
|
123 | }
|
124 | #endif
|
125 |
|
126 |
|
127 | #ifdef USE_OCL
|
128 | int64 start = cv::getTickCount();
|
129 | for (;;)
|
130 | {
|
131 | cap >> frame;
|
132 | if (frame.empty())
|
133 | break;
|
134 | d_frame.upload(frame);
|
135 |
|
136 |
|
137 |
|
138 |
|
139 | switch (m)
|
140 | {
|
141 | case M_MOG:
|
142 | mog(d_frame, d_fgmask, 0.01f);
|
143 | mog.getBackgroundImage(d_bgimg);
|
144 | break;
|
145 |
|
146 | case M_MOG2:
|
147 | mog2(d_frame, d_fgmask);
|
148 | mog2.getBackgroundImage(d_bgimg);
|
149 | break;
|
150 | }
|
151 |
|
152 |
|
153 |
|
154 |
|
155 | d_fgimg.setTo(Scalar::all(0));
|
156 | d_frame.copyTo(d_fgimg, d_fgmask);
|
157 |
|
158 | d_fgmask.download(fgmask);
|
159 | d_fgimg.download(fgimg);
|
160 | if (!d_bgimg.empty())
|
161 | d_bgimg.download(bgimg);
|
162 |
|
163 | imshow("image", frame);
|
164 | imshow("foreground mask", fgmask);
|
165 | imshow("foreground image", fgimg);
|
166 | if (!bgimg.empty())
|
167 | imshow("mean background image", bgimg);
|
168 |
|
169 | if (27 == waitKey(1))
|
170 | break;
|
171 | }
|
172 | double t = (cv::getTickCount() - start) / cv::getTickFrequency();
|
173 | std::cout << "t : " << t << std::endl;
|
174 | getchar();
|
175 | #else
|
176 | int64 start = cv::getTickCount();
|
177 | for (;;)
|
178 | {
|
179 | cap >> frame;
|
180 | if (frame.empty())
|
181 | break;
|
182 |
|
183 |
|
184 |
|
185 |
|
186 | switch (m)
|
187 | {
|
188 | case M_MOG:
|
189 | mog(frame, fgmask, 0.01f);
|
190 | mog.getBackgroundImage(bgimg);
|
191 | break;
|
192 |
|
193 | case M_MOG2:
|
194 | mog2(frame, fgmask);
|
195 | mog2.getBackgroundImage(bgimg);
|
196 | break;
|
197 | }
|
198 |
|
199 |
|
200 |
|
201 |
|
202 | fgimg.setTo(Scalar::all(0));
|
203 | frame.copyTo(fgimg, fgmask);
|
204 |
|
205 |
|
206 | imshow("image", frame);
|
207 | imshow("foreground mask", fgmask);
|
208 | imshow("foreground image", fgimg);
|
209 | if (!bgimg.empty())
|
210 | imshow("mean background image", bgimg);
|
211 |
|
212 | if (27 == waitKey(1))
|
213 | break;
|
214 | }
|
215 |
|
216 | double t = (cv::getTickCount() - start) / cv::getTickFrequency();
|
217 | std::cout << "t : " << t << std::endl;
|
218 | getchar();
|
219 | #endif
|
220 | return EXIT_SUCCESS;
|
221 | }
|