SLProject  4.3.020
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
SENSCamera.h
Go to the documentation of this file.
1 /**
2  * \file SENSCamera.h
3  * \authors Michael Goettlicher, Marcus Hudritsch
4  * \date Winter 2016
5  * \remarks Please use clangformat to format the code. See more code style on
6  * https://github.com/cpvrlab/SLProject4/wiki/SLProject-Coding-Style
7  * \copyright http://opensource.org/licenses/GPL-3.0
8 */
9 
10 #ifndef SENS_CAMERA_H
11 #define SENS_CAMERA_H
12 
13 #include <opencv2/core.hpp>
14 #include "SENSFrame.h"
15 #include "SENSException.h"
16 #include "SENSCalibration.h"
17 #include <atomic>
18 #include <map>
19 #include <thread>
20 #include <algorithm>
21 #include "SENSUtils.h"
22 #include <HighResTimer.h>
23 //-----------------------------------------------------------------------------
24 // Common definitions:
25 //-----------------------------------------------------------------------------
26 //! Definition of camera facing
27 enum class SENSCameraFacing
28 {
29  FRONT = 0,
30  BACK,
31  EXTERNAL,
32  UNKNOWN
33 };
34 //-----------------------------------------------------------------------------
35 //! mapping of SENSCameraFacing to a readable string
36 static std::string getPrintableFacing(SENSCameraFacing facing)
37 {
38  switch (facing)
39  {
40  case SENSCameraFacing::FRONT: return "FRONT";
41  case SENSCameraFacing::BACK: return "BACK";
42  case SENSCameraFacing::EXTERNAL: return "EXTERNAL";
43  default: return "UNKNOWN";
44  }
45 }
46 //-----------------------------------------------------------------------------
47 //! Definition of autofocus mode
49 {
52  UNKNOWN
53 };
54 //-----------------------------------------------------------------------------
55 //! mapping of SENSCameraFocusMode to a readable string
56 static std::string getPrintableFocusMode(SENSCameraFocusMode focusMode)
57 {
58  switch (focusMode)
59  {
60  case SENSCameraFocusMode::CONTINIOUS_AUTO_FOCUS: return "CONTINIOUS_AUTO_FOCUS";
61  case SENSCameraFocusMode::FIXED_INFINITY_FOCUS: return "FIXED_INFINITY_FOCUS";
62  default: return "UNKNOWN";
63  }
64 }
65 //-----------------------------------------------------------------------------
67 {
68  int widthPix = 0;
69  int heightPix = 0;
70  float focalLengthPix = -1.f; //< focal length in pixel (-1 means unknown)
71 };
72 //-----------------------------------------------------------------------------
74 {
75 public:
80  {
81  }
82 
83  int findBestMatchingConfig(cv::Size requiredSize) const;
84  const std::vector<SENSCameraStreamConfig>& streamConfigs() const { return _streamConfigs; }
85  const std::string& deviceId() const { return _deviceId; }
86  const SENSCameraFacing& facing() const { return _facing; }
87 
88  bool contains(cv::Size toFind)
89  {
90  return std::find_if(
91  _streamConfigs.begin(),
92  _streamConfigs.end(),
93  [&](const SENSCameraStreamConfig& cmp) -> bool
94  { return cmp.widthPix == toFind.width && cmp.heightPix == toFind.height; }) != _streamConfigs.end();
95  }
96 
97  void add(int widthPix, int heightPix, float focalLengthPix)
98  {
100  config.widthPix = widthPix;
101  config.heightPix = heightPix;
102  config.focalLengthPix = focalLengthPix;
103  _streamConfigs.push_back(config);
104  }
105 
106 private:
107  std::string _deviceId;
109  std::vector<SENSCameraStreamConfig> _streamConfigs;
110 };
111 //-----------------------------------------------------------------------------
112 /*! SENSCameraConfig
113  This class defines the current configuration of a camera
114  */
116 {
117  // this constructor forces the user to always define a complete parameter set. In this way no parameter is forgotten..
122  : deviceId(deviceId),
124  facing(facing),
126  {
127  }
128  SENSCameraConfig() = default;
129 
130  std::string deviceId;
131  SENSCameraStreamConfig streamConfig; //!< currently selected stream config index (use it to look up original capture size)
132  SENSCameraFocusMode focusMode; //!< autofocus mode
133  SENSCameraFacing facing; //!< camera facing
134 };
135 //-----------------------------------------------------------------------------
136 class SENSCaptureProps : public std::vector<SENSCameraDeviceProps>
137 {
138 public:
139  bool containsDeviceId(const std::string& deviceId) const;
140  bool supportsCameraFacing(const SENSCameraFacing& facing) const;
141  const SENSCameraDeviceProps* camPropsForDeviceId(const std::string& deviceId) const;
142  // returned pointer is null if nothing was found
143  std::pair<const SENSCameraDeviceProps* const, const SENSCameraStreamConfig* const>
145  const float horizFov,
146  const int width,
147  const int height) const;
148 };
149 //-----------------------------------------------------------------------------
151 {
152 public:
153  virtual ~SENSCameraListener() {}
154  virtual void onFrame(const SENSTimePt& timePt, cv::Mat frame) = 0;
156 };
157 //-----------------------------------------------------------------------------
158 //! Pure abstract camera class
160 {
161 public:
162  virtual ~SENSCamera() {}
163 
164  /*!
165  Call this function to configure the camera if you exactly know, what device you want to open and with which stream configuration.
166  You can find out these properties by using SENSCaptureProps object (see getCaptureProperties())
167  @param deviceId camera device id to start
168  @param streamConfig SENSCameraStreamConfig from camera device. This defines the size of the image. The image is converted to BGR and assigned to SENSFrame::imgBGR.
169  @param provideIntrinsics specifies if intrinsics estimation should be enabled. The estimated intrinsics are transferred with every SENSFrame as they may be different for every frame (e.g. on iOS). This value has different effects on different architectures.
170  @returns the found configuration that is adjusted and used when SENSCamera::start() is called.
171  */
172  virtual const SENSCameraConfig& start(std::string deviceId,
173  const SENSCameraStreamConfig& streamConfig,
174  bool provideIntrinsics = true) = 0;
175 
176  //! Stop a started camera device
177  virtual void stop() = 0;
178 
179  //! Get SENSCaptureProps which contains necessary information about all available camera devices and their capabilities
180  virtual const SENSCaptureProps& captureProperties() = 0;
181 
182  //! Get the latest captured frame. If no frame was captured the frame will be empty (null).
184 
185  //! defines how the camera was configured during start
186  virtual const SENSCameraConfig& config() const = 0;
187 
188  virtual void registerListener(SENSCameraListener* listener) = 0;
189  virtual void unregisterListener(SENSCameraListener* listener) = 0;
190  virtual bool started() const = 0;
191  virtual bool permissionGranted() const = 0;
192  virtual void setPermissionGranted() = 0;
193 };
194 //-----------------------------------------------------------------------------
195 //! Implementation of common functionality and members
197 {
198 public:
199  SENSFrameBasePtr latestFrame() override;
200  const SENSCameraConfig& config() const override { return _config; };
201  void registerListener(SENSCameraListener* listener) override;
202  void unregisterListener(SENSCameraListener* listener) override;
203  bool started() const override { return _started; }
204  bool permissionGranted() const override { return _permissionGranted; }
205  void setPermissionGranted() override { _permissionGranted = true; }
206 
207 protected:
208  void updateFrame(cv::Mat bgrImg,
209  cv::Mat intrinsics,
210  int width,
211  int height,
212  bool intrinsicsChanged);
213 
214  void processStart(); //!< call from start function to do startup preprocessing
215 
217  std::atomic<bool> _started{false}; //!< flags if camera was started
218  SENSCameraConfig _config; //!< indicates what is currently running
219  std::atomic<bool> _permissionGranted{false};
220  std::vector<SENSCameraListener*> _listeners;
221  std::mutex _listenerMutex;
222  SENSFrameBasePtr _frame; //!< current frame
223  std::mutex _frameMutex;
224 };
225 //-----------------------------------------------------------------------------
226 #endif // SENS_CAMERA_H
std::chrono::high_resolution_clock::time_point SENSTimePt
Definition: SENS.h:57
static std::string getPrintableFacing(SENSCameraFacing facing)
mapping of SENSCameraFacing to a readable string
Definition: SENSCamera.h:36
static std::string getPrintableFocusMode(SENSCameraFocusMode focusMode)
mapping of SENSCameraFocusMode to a readable string
Definition: SENSCamera.h:56
SENSCameraFocusMode
Definition of autofocus mode.
Definition: SENSCamera.h:49
SENSCameraFacing
Definition of camera facing.
Definition: SENSCamera.h:28
std::shared_ptr< SENSFrameBase > SENSFrameBasePtr
Definition: SENSFrame.h:27
Implementation of common functionality and members.
Definition: SENSCamera.h:197
void registerListener(SENSCameraListener *listener) override
Definition: SENSCamera.cpp:249
std::vector< SENSCameraListener * > _listeners
Definition: SENSCamera.h:220
SENSCameraConfig _config
indicates what is currently running
Definition: SENSCamera.h:218
std::atomic< bool > _permissionGranted
Definition: SENSCamera.h:219
bool started() const override
Definition: SENSCamera.h:203
SENSFrameBasePtr latestFrame() override
Get the latest captured frame. If no frame was captured the frame will be empty (null).
Definition: SENSCamera.cpp:276
SENSCaptureProps _captureProperties
Definition: SENSCamera.h:216
void unregisterListener(SENSCameraListener *listener) override
Definition: SENSCamera.cpp:263
SENSFrameBasePtr _frame
current frame
Definition: SENSCamera.h:222
std::atomic< bool > _started
flags if camera was started
Definition: SENSCamera.h:217
std::mutex _frameMutex
Definition: SENSCamera.h:223
void setPermissionGranted() override
Definition: SENSCamera.h:205
void updateFrame(cv::Mat bgrImg, cv::Mat intrinsics, int width, int height, bool intrinsicsChanged)
Definition: SENSCamera.cpp:220
bool permissionGranted() const override
Definition: SENSCamera.h:204
std::mutex _listenerMutex
Definition: SENSCamera.h:221
void processStart()
call from start function to do startup preprocessing
Definition: SENSCamera.cpp:294
const SENSCameraConfig & config() const override
defines how the camera was configured during start
Definition: SENSCamera.h:200
int findBestMatchingConfig(cv::Size requiredSize) const
Definition: SENSCamera.cpp:13
SENSCameraDeviceProps(const std::string &deviceId, SENSCameraFacing facing)
Definition: SENSCamera.h:77
const SENSCameraFacing & facing() const
Definition: SENSCamera.h:86
bool contains(cv::Size toFind)
Definition: SENSCamera.h:88
std::vector< SENSCameraStreamConfig > _streamConfigs
Definition: SENSCamera.h:109
std::string _deviceId
Definition: SENSCamera.h:107
const std::string & deviceId() const
Definition: SENSCamera.h:85
const std::vector< SENSCameraStreamConfig > & streamConfigs() const
Definition: SENSCamera.h:84
SENSCameraFacing _facing
Definition: SENSCamera.h:108
void add(int widthPix, int heightPix, float focalLengthPix)
Definition: SENSCamera.h:97
Pure abstract camera class.
Definition: SENSCamera.h:160
virtual ~SENSCamera()
Definition: SENSCamera.h:162
virtual SENSFrameBasePtr latestFrame()=0
Get the latest captured frame. If no frame was captured the frame will be empty (null).
virtual const SENSCameraConfig & start(std::string deviceId, const SENSCameraStreamConfig &streamConfig, bool provideIntrinsics=true)=0
virtual void registerListener(SENSCameraListener *listener)=0
virtual bool started() const =0
virtual bool permissionGranted() const =0
virtual void unregisterListener(SENSCameraListener *listener)=0
virtual const SENSCaptureProps & captureProperties()=0
Get SENSCaptureProps which contains necessary information about all available camera devices and thei...
virtual const SENSCameraConfig & config() const =0
defines how the camera was configured during start
virtual void setPermissionGranted()=0
virtual void stop()=0
Stop a started camera device.
virtual void onFrame(const SENSTimePt &timePt, cv::Mat frame)=0
virtual ~SENSCameraListener()
Definition: SENSCamera.h:153
virtual void onCameraConfigChanged(const SENSCameraConfig &config)=0
bool containsDeviceId(const std::string &deviceId) const
Definition: SENSCamera.cpp:61
std::pair< const SENSCameraDeviceProps *const, const SENSCameraStreamConfig *const > findBestMatchingConfig(SENSCameraFacing facing, const float horizFov, const int width, const int height) const
Helper function to find a camera device and stream configuration with certain characteristics.
Definition: SENSCamera.cpp:89
const SENSCameraDeviceProps * camPropsForDeviceId(const std::string &deviceId) const
Definition: SENSCamera.cpp:73
bool supportsCameraFacing(const SENSCameraFacing &facing) const
Definition: SENSCamera.cpp:67
Config config
The configuration set in App::run.
Definition: AppAndroid.cpp:34
SENSCameraFacing facing
camera facing
Definition: SENSCamera.h:133
SENSCameraStreamConfig streamConfig
currently selected stream config index (use it to look up original capture size)
Definition: SENSCamera.h:131
SENSCameraConfig(std::string deviceId, const SENSCameraStreamConfig &streamConfig, SENSCameraFacing facing, SENSCameraFocusMode focusMode=SENSCameraFocusMode::CONTINIOUS_AUTO_FOCUS)
Definition: SENSCamera.h:118
std::string deviceId
Definition: SENSCamera.h:130
SENSCameraFocusMode focusMode
autofocus mode
Definition: SENSCamera.h:132
SENSCameraConfig()=default