SLProject  4.3.020
A platform independent 3D computer graphics framework for desktop OS, Android, iOS and online in web browsers
SENSiOSARKit.mm
Go to the documentation of this file.
1 #include "SENSiOSARKit.h"
2 
4 {
7 }
8 
9 bool SENSiOSARKit::init(unsigned int textureId, bool retrieveCpuImg, int targetWidth)
10 {
11  if (!_available)
12  return false;
13 
14  [_arcoreDelegate initARKit];
15 
16  return true;
17 }
18 
20 {
21  return _arcoreDelegate != nullptr;
22 }
23 
25 {
26  bool success = false;
27  if (_arcoreDelegate)
28  success = [_arcoreDelegate run];
29 
30  if (success)
31  {
32  _pause = false;
33  _started = true; //for SENSBaseCamera
34  }
35 
36  return success;
37 }
38 
40 {
41  if (_arcoreDelegate)
43 }
44 
46 {
47  if (_arcoreDelegate)
49 
50  _pause = true;
51  _started = false; //for SENSBaseCamera
52 }
53 
54 bool SENSiOSARKit::update(cv::Mat& pose)
55 {
56  //retrieve the latest frame from arkit delegate
57  cv::Mat intrinsic;
58  cv::Mat imgBGR;
59  bool isTracking;
60 
61  if (_fetchPointCloud)
62  [_arcoreDelegate latestFrame:&pose withImg:&imgBGR AndIntrinsic:&intrinsic AndImgWidth:&_inputFrameW AndImgHeight:&_inputFrameH IsTracking:&isTracking WithPointClout:&_pointCloud];
63  else
64  [_arcoreDelegate latestFrame:&pose withImg:&imgBGR AndIntrinsic:&intrinsic AndImgWidth:&_inputFrameW AndImgHeight:&_inputFrameH IsTracking:&isTracking WithPointClout:nullptr];
65 
66  if (!imgBGR.empty())
67  {
68  updateFrame(imgBGR, intrinsic, true, imgBGR.cols, imgBGR.rows);
69  }
70  else
71  Utils::log("SENSiOSARKit", "frame is empty!");
72  return isTracking;
73 }
74 
76 {
77  //the SENSBaseCamera needs to have a valid frame, otherwise we cannot estimate the fov correctly
78  if (!_frame)
79  {
80  resume();
81  HighResTimer t;
82  cv::Mat pose;
83  do {
84  update(pose);
85  } while (!_frame && t.elapsedTimeInSec() < 5.f);
86 
87  pause();
88  }
89 
90  if (_frame)
91  {
92  std::string deviceId = "ARKit";
94 
95  float focalLengthPix = -1.f;
96  if (!_frame->intrinsics.empty())
97  {
98  focalLengthPix = 0.5 * (_frame->intrinsics.at<double>(0, 0) + _frame->intrinsics.at<double>(1, 1));
99  }
100  SENSCameraDeviceProps devProp(deviceId, facing);
101  devProp.add(_frame->imgBGR.cols, _frame->imgBGR.rows, focalLengthPix);
102  _captureProperties.push_back(devProp);
103  }
104  else
105  Utils::warnMsg("SENSiOSARKit", "retrieveCaptureProperties: Could not retrieve a valid frame!", __LINE__, __FILE__);
106 }
107 
109 {
110  if (_captureProperties.size() == 0)
112 
113  return _captureProperties;
114 }
115 
116 //This function does not really start the camera as for the arcore iplementation, the frame gets only updated with a call to arcore::update.
117 //This function is needed to correctly use arcore as a camera in SENSCVCamera
118 const SENSCameraConfig& SENSiOSARKit::start(std::string deviceId,
119  const SENSCameraStreamConfig& streamConfig,
120  bool provideIntrinsics)
121 {
122  //define capture properties
123  if (_captureProperties.size() == 0)
125 
126  if (_captureProperties.size() == 0)
127  throw SENSException(SENSType::CAM, "Could not retrieve camera properties!", __LINE__, __FILE__);
128 
129  if (!_captureProperties.containsDeviceId(deviceId))
130  throw SENSException(SENSType::CAM, "DeviceId does not exist!", __LINE__, __FILE__);
131 
134  if (props)
135  facing = props->facing();
136 
137  //init config here before processStart
138  _config = SENSCameraConfig(deviceId,
139  streamConfig,
140  facing,
142  //inform camera listeners
143  processStart();
144 
145  _started = true;
146  return _config;
147 }
SENSCameraFacing
Definition of camera facing.
Definition: SENSCamera.h:28
High Resolution Timer class using C++11.
Definition: HighResTimer.h:31
float elapsedTimeInSec()
Definition: HighResTimer.h:37
SENSCameraConfig _config
indicates what is currently running
Definition: SENSCamera.h:218
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
SENSFrameBasePtr _frame
current frame
Definition: SENSCamera.h:222
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
void add(int widthPix, int heightPix, float focalLengthPix)
Definition: SENSCamera.h:97
bool containsDeviceId(const std::string &deviceId) const
Definition: SENSCamera.cpp:61
const SENSCameraDeviceProps * camPropsForDeviceId(const std::string &deviceId) const
Definition: SENSCamera.cpp:73
void retrieveCaptureProperties()
Definition: SENSiOSARKit.mm:75
bool resume() override
Definition: SENSiOSARKit.mm:24
bool update(cv::Mat &pose) override
Definition: SENSiOSARKit.mm:54
bool isAvailable() override
Definition: SENSiOSARKit.h:20
bool init(unsigned int textureId=0, bool retrieveCpuImg=false, int targetWidth=-1) override
Definition: SENSiOSARKit.mm:9
const SENSCaptureProps & captureProperties() override
Get SENSCaptureProps which contains necessary information about all available camera devices and thei...
void pause() override
Definition: SENSiOSARKit.mm:45
const SENSCameraConfig & start(std::string deviceId, const SENSCameraStreamConfig &streamConfig, bool provideIntrinsics) override
bool isReady() override
Definition: SENSiOSARKit.mm:19
SENSiOSARCoreDelegate * _arcoreDelegate
Definition: SENSiOSARKit.h:35
void reset() override
Definition: SENSiOSARKit.mm:39
int run(Config config)
App::run implementation from App.h for the Emscripten platform.
Definition: AppAndroid.cpp:78
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