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 | false | use camera }" 21 "{ f file | ../data/768x576.avi | input video file }" 22 "{ t type | mog2 | method's type (knn, mog2) }" 23 "{ h help | false | 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