Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/samples/tapi/bgfg_segm.cpp
16337 views
1
#include <iostream>
2
#include <string>
3
4
#include "opencv2/core.hpp"
5
#include "opencv2/core/ocl.hpp"
6
#include "opencv2/core/utility.hpp"
7
#include "opencv2/videoio.hpp"
8
#include "opencv2/highgui.hpp"
9
#include "opencv2/video.hpp"
10
11
using namespace std;
12
using namespace cv;
13
14
#define M_MOG2 2
15
#define M_KNN 3
16
17
int main(int argc, const char** argv)
18
{
19
CommandLineParser cmd(argc, argv,
20
"{ c camera | | use camera }"
21
"{ f file | ../data/vtest.avi | input video file }"
22
"{ t type | mog2 | method's type (knn, mog2) }"
23
"{ h help | | print help message }"
24
"{ m cpu_mode | false | press 'm' to switch OpenCL<->CPU}");
25
26
if (cmd.has("help"))
27
{
28
cout << "Usage : bgfg_segm [options]" << endl;
29
cout << "Available options:" << endl;
30
cmd.printMessage();
31
return EXIT_SUCCESS;
32
}
33
34
bool useCamera = cmd.has("camera");
35
string file = cmd.get<string>("file");
36
string method = cmd.get<string>("type");
37
38
if (method != "mog" && method != "mog2")
39
{
40
cerr << "Incorrect method" << endl;
41
return EXIT_FAILURE;
42
}
43
44
int m = method == "mog2" ? M_MOG2 : M_KNN;
45
46
VideoCapture cap;
47
if (useCamera)
48
cap.open(0);
49
else
50
cap.open(file);
51
52
if (!cap.isOpened())
53
{
54
cout << "can not open camera or video file" << endl;
55
return EXIT_FAILURE;
56
}
57
58
UMat frame, fgmask, fgimg;
59
cap >> frame;
60
fgimg.create(frame.size(), frame.type());
61
62
Ptr<BackgroundSubtractorKNN> knn = createBackgroundSubtractorKNN();
63
Ptr<BackgroundSubtractorMOG2> mog2 = createBackgroundSubtractorMOG2();
64
65
switch (m)
66
{
67
case M_KNN:
68
knn->apply(frame, fgmask);
69
break;
70
71
case M_MOG2:
72
mog2->apply(frame, fgmask);
73
break;
74
}
75
bool running=true;
76
for (;;)
77
{
78
if(!running)
79
break;
80
cap >> frame;
81
if (frame.empty())
82
break;
83
84
int64 start = getTickCount();
85
86
//update the model
87
switch (m)
88
{
89
case M_KNN:
90
knn->apply(frame, fgmask);
91
break;
92
93
case M_MOG2:
94
mog2->apply(frame, fgmask);
95
break;
96
}
97
98
double fps = getTickFrequency() / (getTickCount() - start);
99
std::cout << "FPS : " << fps << std::endl;
100
std::cout << fgimg.size() << std::endl;
101
fgimg.setTo(Scalar::all(0));
102
frame.copyTo(fgimg, fgmask);
103
104
imshow("image", frame);
105
imshow("foreground mask", fgmask);
106
imshow("foreground image", fgimg);
107
108
char key = (char)waitKey(30);
109
110
switch (key)
111
{
112
case 27:
113
running = false;
114
break;
115
case 'm':
116
case 'M':
117
ocl::setUseOpenCL(!ocl::useOpenCL());
118
cout << "Switched to " << (ocl::useOpenCL() ? "OpenCL enabled" : "CPU") << " mode\n";
119
break;
120
}
121
}
122
return EXIT_SUCCESS;
123
}
124
125