Blame view

3rdparty/opencv-4.5.4/apps/interactive-calibration/frameProcessor.hpp 2.89 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
94
95
96
97
98
99
100
101
102
103
104
  // This file is part of OpenCV project.
  // It is subject to the license terms in the LICENSE file found in the top-level directory
  // of this distribution and at http://opencv.org/license.html.
  
  #ifndef FRAME_PROCESSOR_HPP
  #define FRAME_PROCESSOR_HPP
  
  #include <opencv2/core.hpp>
  #include <opencv2/calib3d.hpp>
  #ifdef HAVE_OPENCV_ARUCO
  #include <opencv2/aruco/charuco.hpp>
  #endif
  
  #include "calibCommon.hpp"
  #include "calibController.hpp"
  
  namespace calib
  {
  class FrameProcessor
  {
  protected:
  
  public:
      virtual ~FrameProcessor();
      virtual cv::Mat processFrame(const cv::Mat& frame) = 0;
      virtual bool isProcessed() const = 0;
      virtual void resetState() = 0;
  };
  
  class CalibProcessor : public FrameProcessor
  {
  protected:
      cv::Ptr<calibrationData> mCalibData;
      TemplateType mBoardType;
      cv::Size mBoardSize;
      std::vector<cv::Point2f> mTemplateLocations;
      std::vector<cv::Point2f> mCurrentImagePoints;
      cv::Mat mCurrentCharucoCorners;
      cv::Mat mCurrentCharucoIds;
  
      cv::Ptr<cv::SimpleBlobDetector> mBlobDetectorPtr;
  #ifdef HAVE_OPENCV_ARUCO
      cv::Ptr<cv::aruco::Dictionary> mArucoDictionary;
      cv::Ptr<cv::aruco::CharucoBoard> mCharucoBoard;
  #endif
  
      int mNeededFramesNum;
      unsigned mDelayBetweenCaptures;
      int mCapuredFrames;
      double mMaxTemplateOffset;
      float mSquareSize;
      float mTemplDist;
  
      bool detectAndParseChessboard(const cv::Mat& frame);
      bool detectAndParseChAruco(const cv::Mat& frame);
      bool detectAndParseACircles(const cv::Mat& frame);
      bool detectAndParseDualACircles(const cv::Mat& frame);
      void saveFrameData();
      void showCaptureMessage(const cv::Mat &frame, const std::string& message);
      bool checkLastFrame();
  
  public:
      CalibProcessor(cv::Ptr<calibrationData> data, captureParameters& capParams);
      virtual cv::Mat processFrame(const cv::Mat& frame) CV_OVERRIDE;
      virtual bool isProcessed() const CV_OVERRIDE;
      virtual void resetState() CV_OVERRIDE;
      ~CalibProcessor() CV_OVERRIDE;
  };
  
  enum visualisationMode {Grid, Window};
  
  class ShowProcessor : public FrameProcessor
  {
  protected:
      cv::Ptr<calibrationData> mCalibdata;
      cv::Ptr<calibController> mController;
      TemplateType mBoardType;
      visualisationMode mVisMode;
      bool mNeedUndistort;
      double mGridViewScale;
      double mTextSize;
  
      void drawBoard(cv::Mat& img, cv::InputArray points);
      void drawGridPoints(const cv::Mat& frame);
  public:
      ShowProcessor(cv::Ptr<calibrationData> data, cv::Ptr<calibController> controller, TemplateType board);
      virtual cv::Mat processFrame(const cv::Mat& frame) CV_OVERRIDE;
      virtual bool isProcessed() const CV_OVERRIDE;
      virtual void resetState() CV_OVERRIDE;
  
      void setVisualizationMode(visualisationMode mode);
      void switchVisualizationMode();
      void clearBoardsView();
      void updateBoardsView();
  
      void switchUndistort();
      void setUndistort(bool isEnabled);
      ~ShowProcessor() CV_OVERRIDE;
  };
  
  }
  
  
  #endif