IDS peak ICV v1.1.0
Loading...
Searching...
No Matches
peak_icv_calibration_result.hpp
Go to the documentation of this file.
1
11#pragma once
12
13#include <peak_common_c/detail/peak_common_defines.h>
20#include <peak_icv_c/algorithms/calibration/peak_icv_camera_calibration.h>
21
22#include <tuple>
23
24namespace peak
25{
26namespace icv
27{
45 : private detail::IBackendAccessible<CalibrationResult>
46 , private detail::IBackendExchangeable<CalibrationResult>
47{
48public:
63 explicit CalibrationResult(const std::string& filePath);
64
70 ~CalibrationResult() override;
71
78
84 CalibrationResult(CalibrationResult&& other) noexcept;
85
92
99
110 PEAK_COMMON_NO_DISCARD double GetMeanReprojectionError() const;
111
120 PEAK_COMMON_NO_DISCARD std::vector<CalibrationView> GetViews() const;
121
142 PEAK_COMMON_NO_DISCARD CalibrationParameters GetCalibrationParameters() const;
143
151 operator CalibrationParameters() const; // NOLINT
152
153private:
154 friend peak::common::detail::BackendAccessor<CalibrationResult>;
155
157 explicit CalibrationResult(peak_icv_calibration_result_handle calibrationResultHandle);
158 PEAK_COMMON_NO_DISCARD detail::handle_of_t<CalibrationResult> GetHandle() const override;
159 PEAK_COMMON_NO_DISCARD detail::handle_of_t<CalibrationResult>* GetHandleAddress() override;
160
161 peak_icv_calibration_result_handle m_calibrationResultHandle{};
162};
163
164inline CalibrationResult::CalibrationResult()
165{
167 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_Create(&m_calibrationResultHandle);
168 });
169}
170
171inline detail::handle_of_t<CalibrationResult> CalibrationResult::GetHandle() const
172{
173 return m_calibrationResultHandle;
174}
175
176inline detail::handle_of_t<CalibrationResult>* CalibrationResult::GetHandleAddress()
177{
178 return &m_calibrationResultHandle;
179}
180
181inline CalibrationResult::CalibrationResult(peak_icv_calibration_result_handle calibrationResultHandle)
182 : m_calibrationResultHandle{ calibrationResultHandle }
183{}
184
185inline CalibrationResult::CalibrationResult(const CalibrationResult& other)
186{
188 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_IncreaseUseCount(other.m_calibrationResultHandle);
189 });
190 m_calibrationResultHandle = other.m_calibrationResultHandle;
191}
192
193inline CalibrationResult::CalibrationResult(CalibrationResult&& other) noexcept
194{
195 m_calibrationResultHandle = other.m_calibrationResultHandle;
196 other.m_calibrationResultHandle = nullptr;
197}
198
200{
201 if (m_calibrationResultHandle != other.m_calibrationResultHandle)
202 {
203 if (m_calibrationResultHandle != nullptr)
204 {
206 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_Destroy(m_calibrationResultHandle);
207 });
208 }
209
211 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_IncreaseUseCount(other.m_calibrationResultHandle);
212 });
213 m_calibrationResultHandle = other.m_calibrationResultHandle;
214 }
215
216 return *this;
217}
218
220{
221 if (m_calibrationResultHandle != other.m_calibrationResultHandle)
222 {
223 if (m_calibrationResultHandle != nullptr)
224 {
226 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_Destroy(m_calibrationResultHandle);
227 });
228 }
229
230 m_calibrationResultHandle = other.m_calibrationResultHandle;
231 other.m_calibrationResultHandle = nullptr;
232 }
233
234 return *this;
235}
236
238{
239 if (m_calibrationResultHandle != nullptr)
240 {
241 std::ignore = PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_Destroy(m_calibrationResultHandle);
242 }
243}
244
245inline CalibrationResult::CalibrationResult(const std::string& filePath)
246{
248 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_CreateFromFile(&m_calibrationResultHandle, filePath.c_str());
249 });
250}
251
253{
254 double meanReprojectionError{};
255
257 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_GetMeanReprojectionError(
258 m_calibrationResultHandle, &meanReprojectionError);
259 });
260 return meanReprojectionError;
261}
262
263inline std::vector<CalibrationView> CalibrationResult::GetViews() const
264{
265 size_t numViews{};
267 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_GetCalibrationViews_GetCount(m_calibrationResultHandle, &numViews);
268 });
269
270 if (numViews == 0)
271 {
272 return {};
273 }
274
275 std::vector<peak_icv_calibration_view_handle> viewHandles(numViews);
277 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_Array_Create(viewHandles.data(), viewHandles.size());
278 });
279
280 try
281 {
283 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_GetCalibrationViews(
284 m_calibrationResultHandle, viewHandles.data(), viewHandles.size());
285 });
286 return peak::common::detail::BackendAccessor<CalibrationView>::CreateInstances(viewHandles);
287 }
288 catch (const std::exception&)
289 {
290 std::ignore = PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_Array_Destroy(viewHandles.data(), viewHandles.size());
291 throw;
292 }
293}
294
296{
297 peak_icv_calibration_parameters calibrationParameters{};
298
300 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_Result_ToParameters(
301 m_calibrationResultHandle, &calibrationParameters, sizeof(peak_icv_calibration_parameters));
302 });
303
304 return CalibrationParameters{ calibrationParameters };
305}
306
307inline CalibrationResult::operator CalibrationParameters() const
308{
309 return GetCalibrationParameters();
310}
311
312} /* namespace icv */
313} /* namespace peak */
Holds a complete set of camera calibration parameters, including both intrinsic and extrinsic data.
Holds the results of a camera calibration.
double GetMeanReprojectionError() const
Retrieves the mean reprojection error from the calibration result.
CalibrationResult & operator=(const CalibrationResult &other)
std::vector< CalibrationView > GetViews() const
Returns a vector of CalibrationView objects.
CalibrationParameters GetCalibrationParameters() const
Extracts the calibration parameters from a calibration result.
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
peak::common::detail::c_type_of_t< Type > * handle_of_t