1.3.49
 
Loading...
Searching...
No Matches
CameraCalibration.h
Go to the documentation of this file.
1
16#ifndef HELIOS_CAMERACALIBRATION_H
17#define HELIOS_CAMERACALIBRATION_H
18#include "Context.h"
19
22 explicit CameraCalibration(helios::Context *context);
23
25
32 std::vector<uint> addCheckerboard(const helios::int2 &boardsidesize, const float &patchsize, const helios::vec3 &centrelocation, const helios::vec3 &rotationrad, bool firstblack = true);
33
34
36
40 std::vector<uint> addDefaultCheckerboard(const helios::vec3 &centrelocation, const helios::vec3 &rotationrad);
41
43
50 std::vector<uint> addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector<std::vector<helios::RGBcolor>> &colorassignment = {},
51 const std::vector<std::vector<std::string>> &spectrumassignment = {});
52
54
62 std::vector<uint> addColorboard(const helios::vec3 &centrelocation, float patchsize, const helios::vec3 &rotationrad, const std::vector<std::vector<helios::RGBcolor>> &colorassignment,
63 const std::vector<std::vector<std::string>> &spectrumassignment, const std::string &colorboard_type);
64
65 // //! Set reflectivity for a specific UUID
66 // /**
67 // * \param[in] UUID: Corresponding UUID
68 // * \param[in] filename: name with path of XML file
69 // * \param[in] labelname: label name of data
70 // */
71 // void setColorboardReflectivity(const uint &UUID, const std::string &filename, const std::string &labelname);
72
74
80 std::vector<uint> addDefaultColorboard(const helios::vec3 &centrelocation, float patchsize = 0.5, const helios::vec3 &rotationrad = helios::make_vec3(0, 0, 0));
81
83
89 std::vector<uint> addDGKColorboard(const helios::vec3 &centrelocation, float patchsize = 0.5, const helios::vec3 &rotationrad = helios::make_vec3(0, 0, 0));
90
92
98 std::vector<uint> addCalibriteColorboard(const helios::vec3 &centrelocation, float patchsize = 0.5, const helios::vec3 &rotationrad = helios::make_vec3(0, 0, 0));
99
101
107 std::vector<uint> addSpyderCHECKRColorboard(const helios::vec3 &centrelocation, float patchsize = 0.5, const helios::vec3 &rotationrad = helios::make_vec3(0, 0, 0));
108
114 std::vector<uint> getColorBoardUUIDs();
115
117
123 bool writeSpectralXMLfile(const std::string &filename, const std::string &note, const std::string &label, std::vector<helios::vec2> *spectrum);
124
126
131 bool loadXMLlabeldata(const std::string &filename, const std::string &labelname, std::vector<helios::vec2> &spectraldata);
132
134
141 float GradientDescent(std::vector<std::vector<float>> *expandedcameraspectra, const std::vector<std::vector<float>> &expandedconstinput, const float &learningrate, const std::vector<std::vector<float>> &truevalues);
142
144
151 std::vector<float> updateCameraResponseSpectra(const std::vector<std::string> &camerareponselabels, const std::string &cameralabel, const std::map<uint, std::vector<helios::vec2>> &simulatedinputspectra,
152 const std::vector<std::vector<float>> &truevalues);
153
156 float learningrate = 0.000001;
157 int maxiteration = 500;
158 float minloss = 0.01;
159 std::vector<float> camerarescales = {1, 1, 1};
160 GradientDescentParameters() = default;
161 };
162
163 GradientDescentParameters responseupdateparameters;
164
166
173 void preprocessSpectra(const std::vector<std::string> &sourcelabels, const std::vector<std::string> &cameralabels, std::vector<std::string> &objectlabels, helios::vec2 &wavelengthrange, const std::string &targetlabel = "");
174
176
184 void distortImage(const std::string &cameralabel, const std::vector<std::string> &bandlabels, const helios::vec2 &focalxy, std::vector<double> &distCoeffs, helios::int2 cameraresolution);
185
187
193 float getCameraResponseScale(const std::string &cameralabel, const helios::int2 cameraresolution, const std::vector<std::string> &bandlabels, const std::vector<std::vector<float>> &truevalues);
194
195 std::map<std::string, std::map<std::string, std::vector<helios::vec2>>> processedspectra;
196
198
201 std::vector<uint> readROMCCanopy();
202
203
205
210 void writeCalibratedCameraResponses(const std::vector<std::string> &camerareponselabels, const std::string &calibratemark, float scale);
211
212 // void resetCameraResponses(std::string camerareponselabels, float scale);
213
214 // === PUBLIC METHODS FOR AUTO-CALIBRATION (used by RadiationModel) ===
215
217 struct LabColor {
218 float L, a, b;
219 LabColor(float L_val, float a_val, float b_val) : L(L_val), a(a_val), b(b_val) {
220 }
221 };
222
224 std::string detectColorBoardType() const;
225
227 std::vector<LabColor> getReferenceLab_DGK() const;
228
230 std::vector<LabColor> getReferenceLab_Calibrite() const;
231
233 std::vector<LabColor> getReferenceLab_SpyderCHECKR() const;
234
236 LabColor rgbToLab(const helios::vec3 &rgb) const;
237
239 helios::vec3 labToRgb(const LabColor &lab) const;
240
242 double deltaE76(const LabColor &lab1, const LabColor &lab2) const;
243
245 double deltaE2000(const LabColor &lab1, const LabColor &lab2) const;
246
247protected:
248 std::map<std::string, std::vector<helios::vec2>> calibratedcameraspectra;
249
250 helios::Context *context;
251
253 std::map<int, std::vector<std::vector<bool>>> generateColorBoardSegmentationMasks(const std::string &camera_label, const std::string &colorboard_type) const;
254
255
257
262 std::vector<float> expandSpectrum(const std::vector<helios::vec2> &targetspectrum, float scale);
263
265 std::vector<uint> UUIDs_colorboard;
266
267 std::vector<uint> UUIDs_black;
268
269 std::vector<uint> UUIDs_white;
270
272 helios::RGBcolor white_DGK_01 = helios::make_RGBcolor(1.f, 1.f, 1.f);
273 helios::RGBcolor lightgray_DGK_02 = helios::make_RGBcolor(0.8, 0.8, 0.8);
274 helios::RGBcolor mediumlightgray_DGK_03 = helios::make_RGBcolor(0.6, 0.6, 0.6);
275 helios::RGBcolor mediumdarkgray_DGK_04 = helios::make_RGBcolor(0.4, 0.4, 0.4);
276 helios::RGBcolor darkgray_DGK_05 = helios::make_RGBcolor(0.2, 0.2, 0.2);
277 helios::RGBcolor black_DGK_06 = helios::make_RGBcolor(0., 0., 0.);
278 helios::RGBcolor red_DGK_07 = helios::make_RGBcolor(1, 0.1, 0);
279 helios::RGBcolor yellow_DGK_08 = helios::make_RGBcolor(1, 1, 0);
280 helios::RGBcolor green_DGK_09 = helios::make_RGBcolor(0.4118, 0.7490, 0.2706);
281 helios::RGBcolor skyblue_DGK_10 = helios::make_RGBcolor(0, 0.5647, 1);
282 helios::RGBcolor darkblue_DGK_11 = helios::make_RGBcolor(0.1882, 0.2314, 0.3608);
283 helios::RGBcolor magenta_DGK_12 = helios::make_RGBcolor(1, 0, 0.5647);
284 helios::RGBcolor brickred_DGK_13 = helios::make_RGBcolor(0.7294, 0.0118, 0.1216);
285 helios::RGBcolor orange_DGK_14 = helios::make_RGBcolor(0.9569, 0.6, 0.0078);
286 helios::RGBcolor teal_DGK_15 = helios::make_RGBcolor(0, 0.4549, 0.7412);
287 helios::RGBcolor mauve_DGK_16 = helios::make_RGBcolor(0.66, 0.34, 0.53);
288 helios::RGBcolor lighttan_DGK_17 = helios::make_RGBcolor(0.73, 0.60, 0.51);
289 helios::RGBcolor darktan_DGK_18 = helios::make_RGBcolor(0.66, 0.55, 0.45);
290
291 const std::vector<std::vector<helios::RGBcolor>> colorassignment_DGK = {{white_DGK_01, lightgray_DGK_02, mediumlightgray_DGK_03, mediumdarkgray_DGK_04, darkgray_DGK_05, black_DGK_06},
292 {red_DGK_07, yellow_DGK_08, green_DGK_09, skyblue_DGK_10, darkblue_DGK_11, magenta_DGK_12},
293 {brickred_DGK_13, orange_DGK_14, teal_DGK_15, mauve_DGK_16, lighttan_DGK_17, darktan_DGK_18}};
294
295 const std::vector<std::vector<std::string>> spectrumassignment_DGK = {{"ColorReference_DGK_01", "ColorReference_DGK_02", "ColorReference_DGK_03", "ColorReference_DGK_04", "ColorReference_DGK_05", "ColorReference_DGK_06"},
296 {"ColorReference_DGK_07", "ColorReference_DGK_08", "ColorReference_DGK_09", "ColorReference_DGK_10", "ColorReference_DGK_11", "ColorReference_DGK_12"},
297 {"ColorReference_DGK_13", "ColorReference_DGK_14", "ColorReference_DGK_15", "ColorReference_DGK_16", "ColorReference_DGK_17", "ColorReference_DGK_18"}};
298
300 helios::RGBcolor brown_Calibrite_01 = helios::make_RGBcolor(0.38, 0.25, 0.16);
301 helios::RGBcolor lighttan_Calibrite_02 = helios::make_RGBcolor(0.79, 0.59, 0.54);
302 helios::RGBcolor bluegray_Calibrite_03 = helios::make_RGBcolor(0.34, 0.43, 0.64);
303 helios::RGBcolor olive_Calibrite_04 = helios::make_RGBcolor(0.34, 0.43, 0.22);
304 helios::RGBcolor lavender_Calibrite_05 = helios::make_RGBcolor(0.50, 0.47, 0.70);
305 helios::RGBcolor bluegreen_Calibrite_06 = helios::make_RGBcolor(0.54, 0.75, 0.72);
306 helios::RGBcolor orange_Calibrite_07 = helios::make_RGBcolor(0.85, 0.52, 0.24);
307 helios::RGBcolor midblue_Calibrite_08 = helios::make_RGBcolor(0.22, 0.28, 0.60);
308 helios::RGBcolor lightred_Calibrite_09 = helios::make_RGBcolor(0.78, 0.30, 0.33);
309 helios::RGBcolor violet_Calibrite_10 = helios::make_RGBcolor(0.25, 0.14, 0.36);
310 helios::RGBcolor yellowgreen_Calibrite_11 = helios::make_RGBcolor(0.72, 0.79, 0.32);
311 helios::RGBcolor lightorange_Calibrite_12 = helios::make_RGBcolor(0.87, 0.72, 0.27);
312 helios::RGBcolor blue_Calibrite_13 = helios::make_RGBcolor(0.16, 0.19, 0.48);
313 helios::RGBcolor green_Calibrite_14 = helios::make_RGBcolor(0.36, 0.61, 0.32);
314 helios::RGBcolor red_Calibrite_15 = helios::make_RGBcolor(0.65, 0.19, 0.17);
315 helios::RGBcolor yellow_Calibrite_16 = helios::make_RGBcolor(0.93, 0.86, 0.29);
316 helios::RGBcolor magenta_Calibrite_17 = helios::make_RGBcolor(0.70, 0.27, 0.58);
317 helios::RGBcolor lightblue_Calibrite_18 = helios::make_RGBcolor(0.21, 0.48, 0.71);
318 helios::RGBcolor white_Calibrite_19 = helios::make_RGBcolor(1.0, 1.0, 1.0);
319 helios::RGBcolor lightgray_Calibrite_20 = helios::make_RGBcolor(0.81, 0.81, 0.81);
320 helios::RGBcolor midlightgray_Calibrite_21 = helios::make_RGBcolor(0.68, 0.68, 0.68);
321 helios::RGBcolor middarkgray_Calibrite_22 = helios::make_RGBcolor(0.48, 0.48, 0.48);
322 helios::RGBcolor darkgray_Calibrite_23 = helios::make_RGBcolor(0.27, 0.27, 0.27);
323 helios::RGBcolor black_Calibrite_24 = helios::make_RGBcolor(0.0, 0.0, 0.0);
324
325 const std::vector<std::vector<helios::RGBcolor>> colorassignment_Calibrite = {{brown_Calibrite_01, lighttan_Calibrite_02, bluegray_Calibrite_03, olive_Calibrite_04, lavender_Calibrite_05, bluegreen_Calibrite_06},
326 {orange_Calibrite_07, midblue_Calibrite_08, lightred_Calibrite_09, violet_Calibrite_10, yellowgreen_Calibrite_11, lightorange_Calibrite_12},
327 {blue_Calibrite_13, green_Calibrite_14, red_Calibrite_15, yellow_Calibrite_16, magenta_Calibrite_17, lightblue_Calibrite_18},
328 {white_Calibrite_19, lightgray_Calibrite_20, midlightgray_Calibrite_21, middarkgray_Calibrite_22, darkgray_Calibrite_23, black_Calibrite_24}};
329
330 const std::vector<std::vector<std::string>> spectrumassignment_Calibrite = {
331 {"ColorReference_Calibrite_01", "ColorReference_Calibrite_02", "ColorReference_Calibrite_03", "ColorReference_Calibrite_04", "ColorReference_Calibrite_05", "ColorReference_Calibrite_06"},
332 {"ColorReference_Calibrite_07", "ColorReference_Calibrite_08", "ColorReference_Calibrite_09", "ColorReference_Calibrite_10", "ColorReference_Calibrite_11", "ColorReference_Calibrite_12"},
333 {"ColorReference_Calibrite_13", "ColorReference_Calibrite_14", "ColorReference_Calibrite_15", "ColorReference_Calibrite_16", "ColorReference_Calibrite_17", "ColorReference_Calibrite_18"},
334 {"ColorReference_Calibrite_19", "ColorReference_Calibrite_20", "ColorReference_Calibrite_21", "ColorReference_Calibrite_22", "ColorReference_Calibrite_23", "ColorReference_Calibrite_24"}};
335
337 helios::RGBcolor bluegreen_SpyderCHECKR_01 = helios::make_RGBcolor(0.54, 0.75, 0.72);
338 helios::RGBcolor lavender_SpyderCHECKR_02 = helios::make_RGBcolor(0.50, 0.47, 0.70);
339 helios::RGBcolor olive_SpyderCHECKR_03 = helios::make_RGBcolor(0.34, 0.43, 0.22);
340 helios::RGBcolor bluegray_SpyderCHECKR_04 = helios::make_RGBcolor(0.34, 0.43, 0.64);
341 helios::RGBcolor lighttan_SpyderCHECKR_05 = helios::make_RGBcolor(0.79, 0.59, 0.54);
342 helios::RGBcolor brown_SpyderCHECKR_06 = helios::make_RGBcolor(0.38, 0.25, 0.16);
343 helios::RGBcolor orange_SpyderCHECKR_07 = helios::make_RGBcolor(0.85, 0.52, 0.24);
344 helios::RGBcolor midblue_SpyderCHECKR_08 = helios::make_RGBcolor(0.22, 0.28, 0.60);
345 helios::RGBcolor lightred_SpyderCHECKR_09 = helios::make_RGBcolor(0.78, 0.30, 0.33);
346 helios::RGBcolor violet_SpyderCHECKR_10 = helios::make_RGBcolor(0.25, 0.14, 0.36);
347 helios::RGBcolor yellowgreen_SpyderCHECKR_11 = helios::make_RGBcolor(0.72, 0.79, 0.32);
348 helios::RGBcolor lightorange_SpyderCHECKR_12 = helios::make_RGBcolor(0.87, 0.72, 0.27);
349 helios::RGBcolor lightblue_SpyderCHECKR_13 = helios::make_RGBcolor(0.21, 0.48, 0.71);
350 helios::RGBcolor magenta_SpyderCHECKR_14 = helios::make_RGBcolor(0.70, 0.27, 0.58);
351 helios::RGBcolor yellow_SpyderCHECKR_15 = helios::make_RGBcolor(0.93, 0.86, 0.29);
352 helios::RGBcolor red_SpyderCHECKR_16 = helios::make_RGBcolor(0.65, 0.19, 0.17);
353 helios::RGBcolor green_SpyderCHECKR_17 = helios::make_RGBcolor(0.36, 0.61, 0.32);
354 helios::RGBcolor blue_SpyderCHECKR_18 = helios::make_RGBcolor(0.16, 0.19, 0.48);
355 helios::RGBcolor white_SpyderCHECKR_19 = helios::make_RGBcolor(1.0, 1.0, 1.0);
356 helios::RGBcolor lightgray_SpyderCHECKR_20 = helios::make_RGBcolor(0.81, 0.81, 0.81);
357 helios::RGBcolor midlightgray_SpyderCHECKR_21 = helios::make_RGBcolor(0.68, 0.68, 0.68);
358 helios::RGBcolor middarkgray_SpyderCHECKR_22 = helios::make_RGBcolor(0.48, 0.48, 0.48);
359 helios::RGBcolor darkgray_SpyderCHECKR_23 = helios::make_RGBcolor(0.27, 0.27, 0.27);
360 helios::RGBcolor black_SpyderCHECKR_24 = helios::make_RGBcolor(0.0, 0.0, 0.0);
361
362 const std::vector<std::vector<helios::RGBcolor>> colorassignment_SpyderCHECKR = {{bluegreen_SpyderCHECKR_01, lavender_SpyderCHECKR_02, olive_SpyderCHECKR_03, bluegray_SpyderCHECKR_04, lighttan_SpyderCHECKR_05, brown_SpyderCHECKR_06},
363 {orange_SpyderCHECKR_07, midblue_SpyderCHECKR_08, lightred_SpyderCHECKR_09, violet_SpyderCHECKR_10, yellowgreen_SpyderCHECKR_11, lightorange_SpyderCHECKR_12},
364 {lightblue_SpyderCHECKR_13, magenta_SpyderCHECKR_14, yellow_SpyderCHECKR_15, red_SpyderCHECKR_16, green_SpyderCHECKR_17, blue_SpyderCHECKR_18},
365 {white_SpyderCHECKR_19, lightgray_SpyderCHECKR_20, midlightgray_SpyderCHECKR_21, middarkgray_SpyderCHECKR_22, darkgray_SpyderCHECKR_23, black_SpyderCHECKR_24}};
366
367 const std::vector<std::vector<std::string>> spectrumassignment_SpyderCHECKR = {
368 {"ColorReference_SpyderCHECKR_01", "ColorReference_SpyderCHECKR_02", "ColorReference_SpyderCHECKR_03", "ColorReference_SpyderCHECKR_04", "ColorReference_SpyderCHECKR_05", "ColorReference_SpyderCHECKR_06"},
369 {"ColorReference_SpyderCHECKR_07", "ColorReference_SpyderCHECKR_08", "ColorReference_SpyderCHECKR_09", "ColorReference_SpyderCHECKR_10", "ColorReference_SpyderCHECKR_11", "ColorReference_SpyderCHECKR_12"},
370 {"ColorReference_SpyderCHECKR_13", "ColorReference_SpyderCHECKR_14", "ColorReference_SpyderCHECKR_15", "ColorReference_SpyderCHECKR_16", "ColorReference_SpyderCHECKR_17", "ColorReference_SpyderCHECKR_18"},
371 {"ColorReference_SpyderCHECKR_19", "ColorReference_SpyderCHECKR_20", "ColorReference_SpyderCHECKR_21", "ColorReference_SpyderCHECKR_22", "ColorReference_SpyderCHECKR_23", "ColorReference_SpyderCHECKR_24"}};
372};
373
374#endif // HELIOS_CAMERACALIBRATION_H