IDS peak ICV v1.3.0
Loading...
Searching...
No Matches
CalibrationResult.cs
Go to the documentation of this file.
1using System.Runtime.InteropServices;
4using Microsoft.Win32.SafeHandles;
5
7
26public class CalibrationResult : IDisposable, IHasSafeHandle
27{
28 internal readonly Handle _handle;
29
48 public CalibrationResult(string filePath)
49 {
50 var handle = new Handle(filePath);
51 _handle = handle;
52 }
53
54 internal CalibrationResult(Handle handle)
55 {
56 _handle = handle;
57 }
58
90 {
91 get
92 {
93 var calibrationParameters = new Backend.Types.peak_icv_calibration_parameters();
94
95 DllHelper.ExecuteAndMapReturnCodes(() => CInterface.peak_icv_Calibration_Result_ToParameters(
96 _handle, out calibrationParameters,
97 (nuint) Marshal.SizeOf<Backend.Types.peak_icv_calibration_parameters>()));
98 return new CalibrationParameters(calibrationParameters);
99 }
100 }
101
113 {
114 get
115 {
116 var meanReprojectionError = 0.0;
117 DllHelper.ExecuteAndMapReturnCodes(() =>
118 CInterface.peak_icv_Calibration_Result_GetMeanReprojectionError(
119 _handle, out meanReprojectionError));
120 return meanReprojectionError;
121 }
122 }
123
133 {
134 get
135 {
136 nuint numViews = 0;
137 DllHelper.ExecuteAndMapReturnCodes(() =>
138 CInterface.peak_icv_Calibration_Result_GetCalibrationViews_GetCount(
139 _handle, out numViews));
140
141 if (numViews == 0)
142 {
144 }
145
146 var viewHandles = new IntPtr[numViews];
147 DllHelper.ExecuteAndMapReturnCodes(() =>
148 CInterface.peak_icv_Calibration_View_Array_Create(viewHandles, numViews));
149
150 try
151 {
152 DllHelper.ExecuteAndMapReturnCodes(() =>
153 CInterface.peak_icv_Calibration_Result_GetCalibrationViews(_handle, viewHandles, numViews));
154
155 return new DisposableList<CalibrationView>(viewHandles
156 .Select(handle => new CalibrationView(new CalibrationView.Handle(handle)))
157 .ToList());
158 }
159 catch (Exception)
160 {
161 CInterface.peak_icv_Calibration_View_Array_Destroy(viewHandles, numViews);
162 throw;
163 }
164 }
165 }
166
171 public void Dispose()
172 {
173 _handle.Dispose();
174 GC.SuppressFinalize(this);
175 }
176
177 SafeHandle IHasSafeHandle.Handle => _handle;
178
190 public static implicit operator CalibrationParameters(CalibrationResult calibrationResult)
191 {
192 return calibrationResult.CalibrationParameters;
193 }
194
195 internal sealed class Handle : SafeHandleZeroOrMinusOneIsInvalid
196 {
197 internal Handle() : base(true)
198 {
199 DllHelper.ExecuteAndMapReturnCodes(() =>
200 CInterface.peak_icv_Calibration_Result_Create(out handle));
201 }
202
203 internal Handle(string filePath) : base(true)
204 {
205 DllHelper.ExecuteAndMapReturnCodes(() =>
206 CInterface.peak_icv_Calibration_Result_CreateFromFile(out handle,
207 Utils.ToUtf8(filePath)));
208 }
209
210 protected override bool ReleaseHandle()
211 {
212 return CInterface.peak_icv_Calibration_Result_Destroy(handle) ==
213 Backend.Types.peak_icv_status.PEAK_ICV_STATUS_SUCCESS;
214 }
215 }
216
217 private static class CInterface
218 {
219 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
220 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_Create(
221 out IntPtr handle);
222
223 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
224 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_CreateFromFile(
225 out IntPtr handle,
226 byte[] filePath);
227
228 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
229 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_Destroy(
230 IntPtr handle);
231
232 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
233 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_GetMeanReprojectionError(
234 Handle handle, out double meanReprojectionError);
235
236 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
237 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_ToParameters(
238 Handle handle, out Backend.Types.peak_icv_calibration_parameters calibration_parameters,
239 nuint size_of_calibration_parameters);
240
241 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
242 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_GetCalibrationViews_GetCount(
243 Handle handle, out nuint calibration_view_count);
244
245 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
246 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_Result_GetCalibrationViews(
247 Handle handle, IntPtr[] calibration_view_handle, nuint calibration_view_count);
248
249 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
250 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_View_Array_Create(
251 IntPtr[] handle, nuint calibration_view_count);
252
253 [DllImport(Global.LibraryName, CallingConvention = Global.CallingConvention)]
254 public static extern Backend.Types.peak_icv_status peak_icv_Calibration_View_Array_Destroy(
255 IntPtr[] handle, nuint calibration_view_count);
256 }
257}
Holds a complete set of camera calibration parameters, including both intrinsic and extrinsic data.
double MeanReprojectionError
Retrieves the mean reprojection error from the calibration result.
CalibrationParameters CalibrationParameters
Extracts the calibration parameters from a calibration result.
void Dispose()
Releases the resources used by the CalibrationResult class.
CalibrationResult(string filePath)
Constructs a CalibrationResult instance by loading data from a JSON file.
DisposableList< CalibrationView > Views
Returns a vector of CalibrationView objects.
Represents a single observation of a calibration plate in an image.
A list that automatically calls IDisposable.Dispose on all its elements when disposed.