Home | History | Annotate | Download | only in tapi
      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