Blame view

3rdparty/opencv-4.5.4/samples/cpp/videocapture_starter.cpp 3.13 KB
f4334277   Hu Chunming   提交3rdparty
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
  /**
  * @file videocapture_starter.cpp
  * @brief A starter sample for using OpenCV VideoCapture with capture devices, video files or image sequences
  * easy as CV_PI right?
  *
  *  Created on: Nov 23, 2010
  *      Author: Ethan Rublee
  *
  *  Modified on: April 17, 2013
  *      Author: Kevin Hughes
  */
  
  #include <opencv2/imgcodecs.hpp>
  #include <opencv2/videoio.hpp>
  #include <opencv2/highgui.hpp>
  
  #include <iostream>
  #include <stdio.h>
  
  using namespace cv;
  using namespace std;
  
  //hide the local functions in an anon namespace
  namespace {
      void help(char** av) {
          cout << "The program captures frames from a video file, image sequence (01.jpg, 02.jpg ... 10.jpg) or camera connected to your computer." << endl
               << "Usage:\n" << av[0] << " <video file, image sequence or device number>" << endl
               << "q,Q,esc -- quit" << endl
               << "space   -- save frame" << endl << endl
               << "\tTo capture from a camera pass the device number. To find the device number, try ls /dev/video*" << endl
               << "\texample: " << av[0] << " 0" << endl
               << "\tYou may also pass a video file instead of a device number" << endl
               << "\texample: " << av[0] << " video.avi" << endl
               << "\tYou can also pass the path to an image sequence and OpenCV will treat the sequence just like a video." << endl
               << "\texample: " << av[0] << " right%%02d.jpg" << endl;
      }
  
      int process(VideoCapture& capture) {
          int n = 0;
          char filename[200];
          string window_name = "video | q or esc to quit";
          cout << "press space to save a picture. q or esc to quit" << endl;
          namedWindow(window_name, WINDOW_KEEPRATIO); //resizable window;
          Mat frame;
  
          for (;;) {
              capture >> frame;
              if (frame.empty())
                  break;
  
              imshow(window_name, frame);
              char key = (char)waitKey(30); //delay N millis, usually long enough to display and capture input
  
              switch (key) {
              case 'q':
              case 'Q':
              case 27: //escape key
                  return 0;
              case ' ': //Save an image
                  sprintf(filename,"filename%.3d.jpg",n++);
                  imwrite(filename,frame);
                  cout << "Saved " << filename << endl;
                  break;
              default:
                  break;
              }
          }
          return 0;
      }
  }
  
  int main(int ac, char** av) {
      cv::CommandLineParser parser(ac, av, "{help h||}{@input||}");
      if (parser.has("help"))
      {
          help(av);
          return 0;
      }
      std::string arg = parser.get<std::string>("@input");
      if (arg.empty()) {
          help(av);
          return 1;
      }
      VideoCapture capture(arg); //try to open string, this will attempt to open it as a video file or image sequence
      if (!capture.isOpened()) //if this fails, try to open as a video camera, through the use of an integer param
          capture.open(atoi(arg.c_str()));
      if (!capture.isOpened()) {
          cerr << "Failed to open the video device, video file or image sequence!\n" << endl;
          help(av);
          return 1;
      }
      return process(capture);
  }