SLProject  4.3.020
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
SENSiOSCamera.mm
Go to the documentation of this file.
1 #import "SENSiOSCamera.h"
2 #include <Utils.h>
3 #include <functional>
4 #include <SENSUtils.h>
5 #include <memory>
6 
8 {
9  _cameraDelegate = [[SENSiOSCameraDelegate alloc] init];
10  [_cameraDelegate setPermissionCB:std::bind(&SENSiOSCamera::updatePermission, this, std::placeholders::_1)];
11  [_cameraDelegate setUpdateCB:std::bind(&SENSiOSCamera::processNewFrame, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)];
12  //todo: fixme
13  _permissionGranted = true;
14 }
15 
17 {
18 }
19 
20 const SENSCameraConfig& SENSiOSCamera::start(std::string deviceId,
21  const SENSCameraStreamConfig& streamConfig,
22  bool provideIntrinsics)
23 {
24  if (_started)
25  {
26  Utils::warnMsg("SENSiOSCamera", "Call to start was ignored. Camera is currently running!", __LINE__, __FILE__);
27  return _config;
28  }
29 
30  //retrieve all camera characteristics
31  if (_captureProperties.size() == 0)
32  _captureProperties = [_cameraDelegate retrieveCaptureProperties];
33 
34  if (_captureProperties.size() == 0)
35  throw SENSException(SENSType::CAM, "Could not retrieve camera properties!", __LINE__, __FILE__);
36 
37  if (!_captureProperties.containsDeviceId(deviceId))
38  throw SENSException(SENSType::CAM, "DeviceId does not exist!", __LINE__, __FILE__);
39 
42  if (props)
43  facing = props->facing();
44 
45  NSString* devId = [NSString stringWithUTF8String:deviceId.c_str()];
46 
47  BOOL enableVideoStabilization = YES;
48  if (provideIntrinsics)
49  enableVideoStabilization = NO;
50 
51  BOOL extractedExpr = [_cameraDelegate startCamera:devId
52  withWidth:streamConfig.widthPix
53  andHeight:streamConfig.heightPix
54  autoFocusState:YES //alway on on ios because they provide dynamic intrinsics
55  videoStabilizationState:enableVideoStabilization
56  intrinsicsState:provideIntrinsics];
57  if (extractedExpr)
58  {
59  //init config here before processStart
60  _config = SENSCameraConfig(deviceId,
61  streamConfig,
62  facing,
64  processStart();
65 
66  _started = true;
67  }
68  else
69  {
70  throw SENSException(SENSType::CAM, "Could not start camera!", __LINE__, __FILE__);
71  }
72 
73  return _config;
74 }
75 
77 {
78  if (_started)
79  {
80  if ([_cameraDelegate stopCamera])
81  _started = false;
82  }
83  else
84  Utils::log("SENSiOSCamera", "Camera not started but stop called!");
85 }
86 
88 {
89  if (_captureProperties.size() == 0)
90  _captureProperties = [_cameraDelegate retrieveCaptureProperties];
91 
92  return _captureProperties;
93 }
94 
95 void SENSiOSCamera::processNewFrame(unsigned char* data, int imgWidth, int imgHeight, matrix_float3x3* camMat3x3)
96 {
97  //Utils::log("SENSiOSCamera", "processNewFrame: w %d w %d", imgWidth, imgHeight);
98  cv::Mat bgra(imgHeight, imgWidth, CV_8UC4, (void*)data);
99  cv::Mat bgrImg;
100  cvtColor(bgra, bgrImg, cv::COLOR_BGRA2BGR, 3);
101 
102  cv::Mat intrinsics;
103  bool intrinsicsChanged = false;
104  if (camMat3x3)
105  {
106  intrinsicsChanged = true;
107  intrinsics = cv::Mat_<double>(3, 3);
108  for (int i = 0; i < 3; ++i)
109  {
110  simd_float3 col = camMat3x3->columns[i];
111  intrinsics.at<double>(0, i) = (double)col[0];
112  intrinsics.at<double>(1, i) = (double)col[1];
113  intrinsics.at<double>(2, i) = (double)col[2];
114  }
115  }
116 
117  updateFrame(bgrImg, intrinsics, intrinsicsChanged, imgWidth, imgHeight);
118 }
119 
121 {
122  _permissionGranted = granted;
123 }
SENSCameraFacing
Definition of camera facing.
Definition: SENSCamera.h:28
SENSCameraConfig _config
indicates what is currently running
Definition: SENSCamera.h:218
std::atomic< bool > _permissionGranted
Definition: SENSCamera.h:219
SENSCaptureProps _captureProperties
Definition: SENSCamera.h:216
std::atomic< bool > _started
flags if camera was started
Definition: SENSCamera.h:217
void updateFrame(cv::Mat bgrImg, cv::Mat intrinsics, int width, int height, bool intrinsicsChanged)
Definition: SENSCamera.cpp:220
void processStart()
call from start function to do startup preprocessing
Definition: SENSCamera.cpp:294
const SENSCameraFacing & facing() const
Definition: SENSCamera.h:86
bool containsDeviceId(const std::string &deviceId) const
Definition: SENSCamera.cpp:61
const SENSCameraDeviceProps * camPropsForDeviceId(const std::string &deviceId) const
Definition: SENSCamera.cpp:73
const SENSCameraConfig & start(std::string deviceId, const SENSCameraStreamConfig &streamConfig, bool provideIntrinsics=true) override
on ios we can ignore fovDegFallbackGuess as the api provides dynamic camera intrinsics
SENSiOSCameraDelegate * _cameraDelegate
Definition: SENSiOSCamera.h:27
void stop() override
Stop a started camera device.
const SENSCaptureProps & captureProperties() override
Get SENSCaptureProps which contains necessary information about all available camera devices and thei...
void processNewFrame(unsigned char *data, int imgWidth, int imgHeight, matrix_float3x3 *camMat3x3)
void updatePermission(bool granted)
void warnMsg(const char *tag, const char *msg, const int line, const char *file)
Platform independent warn message output.
Definition: Utils.cpp:1142
void log(const char *tag, const char *format,...)
logs a formatted string platform independently
Definition: Utils.cpp:1100