IDS peak ICV v1.3.0
Loading...
Searching...
No Matches
peak_icv_calibration_view.hpp
Go to the documentation of this file.
1
11#pragma once
12
13#include <peak_common_c/detail/peak_common_defines.h>
21#include <peak_icv_c/algorithms/calibration/peak_icv_calibration_view.h>
22
23#include <tuple>
24
25namespace peak
26{
27namespace icv
28{
48 : private detail::IBackendAccessible<CalibrationView>
49 , private detail::IBackendExchangeable<CalibrationView>
50{
51public:
57 ~CalibrationView() override;
58
64 CalibrationView(const CalibrationView& other);
65
71 CalibrationView(CalibrationView&& other) noexcept;
72
79
85 CalibrationView& operator=(CalibrationView&& other) noexcept;
86
99 PEAK_COMMON_NO_DISCARD std::vector<ReprojectionError> GetReprojectionErrors() const;
100
113 PEAK_COMMON_NO_DISCARD ExtrinsicParameters GetExtrinsicParameters() const;
114
126 PEAK_COMMON_NO_DISCARD PolygonF GetConvexHull() const;
127
143 PEAK_COMMON_NO_DISCARD CoordinateSystem GetCoordinateSystem() const;
144
145
146private:
147 friend peak::common::detail::BackendAccessor<CalibrationView>;
148
150 explicit CalibrationView(peak_icv_calibration_view_handle calibrationViewHandle);
151 PEAK_COMMON_NO_DISCARD detail::handle_of_t<CalibrationView> GetHandle() const override;
152 PEAK_COMMON_NO_DISCARD detail::handle_of_t<CalibrationView>* GetHandleAddress() override;
153
154 peak_icv_calibration_view_handle m_calibrationViewHandle{};
155};
156
157inline CalibrationView::CalibrationView()
158{
160 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_Create(&m_calibrationViewHandle);
161 });
162}
163
164inline CalibrationView::CalibrationView(peak_icv_calibration_view_handle calibrationViewHandle)
165 : m_calibrationViewHandle(calibrationViewHandle)
166{}
167
169{
170 if (m_calibrationViewHandle != nullptr)
171 {
172 std::ignore = PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_Destroy(m_calibrationViewHandle);
173 }
174}
175
176inline CalibrationView::CalibrationView(const CalibrationView& other)
177{
179 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_IncreaseUseCount(other.m_calibrationViewHandle);
180 });
181 m_calibrationViewHandle = other.m_calibrationViewHandle;
182}
183
184inline CalibrationView::CalibrationView(CalibrationView&& other) noexcept
185 : m_calibrationViewHandle(other.m_calibrationViewHandle)
186{
187 other.m_calibrationViewHandle = nullptr;
188}
189
191{
192 if (this == &other)
193 {
194 return *this;
195 }
196
197 if (m_calibrationViewHandle != nullptr)
198 {
200 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_Destroy(m_calibrationViewHandle);
201 });
202 }
203
205 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_IncreaseUseCount(other.m_calibrationViewHandle);
206 });
207 m_calibrationViewHandle = other.m_calibrationViewHandle;
208 return *this;
209}
210
212{
213 if (this == &other)
214 {
215 return *this;
216 }
217
218 if (m_calibrationViewHandle != nullptr)
219 {
221 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_Destroy(m_calibrationViewHandle);
222 });
223 }
224
225 m_calibrationViewHandle = other.m_calibrationViewHandle;
226 other.m_calibrationViewHandle = nullptr;
227 return *this;
228}
229
230inline detail::handle_of_t<CalibrationView> CalibrationView::GetHandle() const
231{
232 return m_calibrationViewHandle;
233}
234
235inline detail::handle_of_t<CalibrationView>* CalibrationView::GetHandleAddress()
236{
237 return &m_calibrationViewHandle;
238}
239
240inline std::vector<ReprojectionError> CalibrationView::GetReprojectionErrors() const
241{
242 size_t reprojectionErrorsCount{};
244 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_GetReprojectionErrors_GetCount(
245 m_calibrationViewHandle, &reprojectionErrorsCount);
246 });
247
248 if (reprojectionErrorsCount == 0)
249 {
250 return {};
251 }
252
253 std::vector<peak_icv_reprojection_error> cReprojectionErrors(reprojectionErrorsCount);
254
256 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_GetReprojectionErrors(
257 m_calibrationViewHandle, cReprojectionErrors.data(), reprojectionErrorsCount);
258 });
259
260 std::vector<ReprojectionError> reprojectionErrors;
261 reprojectionErrors.reserve(reprojectionErrorsCount);
262
263 std::transform(cReprojectionErrors.begin(), cReprojectionErrors.end(), std::back_inserter(reprojectionErrors),
264 [&](const auto& reprojectionError) -> ReprojectionError {
265 return reprojectionError;
266 });
267
268 return reprojectionErrors;
269}
270
272{
273 peak_icv_extrinsic_parameters extrinsicParameters{};
275 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_GetExtrinsicParameters(
276 m_calibrationViewHandle, &extrinsicParameters, sizeof(extrinsicParameters));
277 });
278 return peak::common::detail::BackendAccessor<ExtrinsicParameters>::CreateInstance(extrinsicParameters);
279}
280
282{
283 PolygonF polygonF{};
284 auto* polygonHandle = peak::common::detail::BackendAccessor<PolygonF>::BackendHandle(polygonF);
285
287 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_GetConvexHull(m_calibrationViewHandle, &polygonHandle);
288 });
289
290 return peak::common::detail::BackendAccessor<PolygonF>::CreateInstance(polygonHandle);
291}
292
294{
295 peak_icv_coordinate_system coordinateSystem{};
297 return PEAK_ICV_C_ABI_PREFIX peak_icv_Calibration_View_GetCoordinateSystem(m_calibrationViewHandle, &coordinateSystem);
298 });
299
300 return peak::common::detail::BackendAccessor<CoordinateSystem>::CreateInstance(coordinateSystem);
301}
302
303} /* namespace icv */
304} /* namespace peak */
Represents a single observation of a calibration plate in an image.
std::vector< ReprojectionError > GetReprojectionErrors() const
Provides the reprojection errors for every marker in the view.
CoordinateSystem GetCoordinateSystem() const
Provides the calibration plate coordinate system projected into the image.
ExtrinsicParameters GetExtrinsicParameters() const
Provides the extrinsic parameters for the view.
PolygonF GetConvexHull() const
Provides the convex hull of the found calibration plate in the view.
CalibrationView & operator=(const CalibrationView &other)
Represents the coordinate system of a calibration view projected into the image plane....
This class stores and provides access to the extrinsic parameters, which include the translation,...
Represents the reprojection error for a marker point in the image.
A polygon is a two-dimensional geometric shape that is made up of a finite number of straight line se...
void ExecuteAndMapReturnCodes(const CallableType &callableObject)
peak::common::detail::c_type_of_t< Type > * handle_of_t