The open source OpenXR runtime
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

aux/tracking; st/gui: save/load calibration gui state to file

authored by

Moses Turner and committed by
Jakob Bornecrantz
7b3378b2 254c233c

+216 -46
+199
src/xrt/auxiliary/tracking/t_data_utils.c
··· 9 9 10 10 #include "tracking/t_tracking.h" 11 11 12 + #include "util/u_config_json.h" 12 13 #include "util/u_misc.h" 13 14 #include "util/u_logging.h" 14 15 ··· 155 156 dump_mat("camera_rotation", c->camera_rotation); 156 157 U_LOG_RAW("}"); 157 158 } 159 + 160 + void 161 + t_calibration_gui_params_parse_from_json(const struct cJSON *params, struct t_calibration_params *p) 162 + { 163 + if (params == NULL || p == NULL) { 164 + return; 165 + } 166 + 167 + const struct cJSON *c = params; // Less typing 168 + 169 + 170 + u_json_get_bool(u_json_get(c, "use_fisheye"), &p->use_fisheye); 171 + u_json_get_bool(u_json_get(c, "stereo_sbs"), &p->stereo_sbs); 172 + u_json_get_bool(u_json_get(c, "save_images"), &p->save_images); 173 + u_json_get_bool(u_json_get(c, "mirror_rgb_image"), &p->mirror_rgb_image); 174 + 175 + 176 + u_json_get_int(u_json_get(c, "num_cooldown_frames"), &p->num_cooldown_frames); 177 + u_json_get_int(u_json_get(c, "num_wait_for"), &p->num_wait_for); 178 + u_json_get_int(u_json_get(c, "num_collect_total"), &p->num_collect_total); 179 + u_json_get_int(u_json_get(c, "num_collect_restart"), &p->num_collect_restart); 180 + 181 + u_json_get_bool(u_json_get(u_json_get(c, "load"), "enabled"), &p->load.enabled); 182 + u_json_get_int(u_json_get(u_json_get(c, "load"), "num_images"), &p->load.num_images); 183 + 184 + 185 + const struct cJSON *pattern_j = u_json_get(c, "pattern"); 186 + char *pattern_s = cJSON_GetStringValue(pattern_j); 187 + if (pattern_s != NULL) { 188 + if (strcmp(pattern_s, "checkers") == 0) { 189 + p->pattern = T_BOARD_CHECKERS; 190 + } else if (strcmp(pattern_s, "sb_checkers") == 0) { 191 + p->pattern = T_BOARD_SB_CHECKERS; 192 + } else if (strcmp(pattern_s, "circles") == 0) { 193 + p->pattern = T_BOARD_CIRCLES; 194 + } else if (strcmp(pattern_s, "asymmetric_circles") == 0) { 195 + p->pattern = T_BOARD_ASYMMETRIC_CIRCLES; 196 + } 197 + // If we get here that is bad 198 + } 199 + 200 + { 201 + const struct cJSON *pat = u_json_get(c, "checkers"); 202 + u_json_get_int(u_json_get(pat, "cols"), &p->checkers.cols); 203 + u_json_get_int(u_json_get(pat, "rows"), &p->checkers.rows); 204 + u_json_get_float(u_json_get(pat, "size_meters"), &p->checkers.size_meters); 205 + u_json_get_bool(u_json_get(pat, "subpixel_enable"), &p->checkers.subpixel_enable); 206 + u_json_get_int(u_json_get(pat, "subpixel_size"), &p->checkers.subpixel_size); 207 + } 208 + { 209 + const struct cJSON *pat = u_json_get(c, "sb_checkers"); 210 + u_json_get_int(u_json_get(pat, "cols"), &p->sb_checkers.cols); 211 + u_json_get_int(u_json_get(pat, "rows"), &p->sb_checkers.rows); 212 + u_json_get_float(u_json_get(pat, "size_meters"), &p->sb_checkers.size_meters); 213 + u_json_get_bool(u_json_get(pat, "marker"), &p->sb_checkers.marker); 214 + u_json_get_bool(u_json_get(pat, "normalize_image"), &p->sb_checkers.normalize_image); 215 + } 216 + { 217 + const struct cJSON *pat = u_json_get(c, "circles"); 218 + u_json_get_int(u_json_get(pat, "cols"), &p->circles.cols); 219 + u_json_get_int(u_json_get(pat, "rows"), &p->circles.rows); 220 + u_json_get_float(u_json_get(pat, "distance_meters"), &p->circles.distance_meters); 221 + } 222 + { 223 + const struct cJSON *pat = u_json_get(c, "asymmetric_circles"); 224 + u_json_get_int(u_json_get(pat, "cols"), &p->asymmetric_circles.cols); 225 + u_json_get_int(u_json_get(pat, "rows"), &p->asymmetric_circles.rows); 226 + u_json_get_float(u_json_get(pat, "diagonal_distance_meters"), 227 + &p->asymmetric_circles.diagonal_distance_meters); 228 + } 229 + } 230 + 231 + void 232 + t_calibration_gui_params_to_json(struct cJSON **out_json, struct t_calibration_params *p) 233 + { 234 + struct cJSON *scene = cJSON_CreateObject(); 235 + 236 + cJSON_AddBoolToObject(scene, "use_fisheye", p->use_fisheye); 237 + cJSON_AddBoolToObject(scene, "stereo_sbs", p->stereo_sbs); 238 + 239 + cJSON_AddBoolToObject(scene, "mirror_rgb_image", p->mirror_rgb_image); 240 + cJSON_AddBoolToObject(scene, "save_images", p->save_images); 241 + 242 + cJSON_AddNumberToObject(scene, "num_cooldown_frames", p->num_cooldown_frames); 243 + cJSON_AddNumberToObject(scene, "num_wait_for", p->num_wait_for); 244 + cJSON_AddNumberToObject(scene, "num_collect_total", p->num_collect_total); 245 + cJSON_AddNumberToObject(scene, "num_collect_restart", p->num_collect_restart); 246 + 247 + struct cJSON *load = cJSON_AddObjectToObject(scene, "load"); 248 + cJSON_AddBoolToObject(load, "enabled", p->load.enabled); 249 + cJSON_AddNumberToObject(load, "num_images", p->load.num_images); 250 + 251 + switch (p->pattern) { 252 + case T_BOARD_CHECKERS: cJSON_AddStringToObject(scene, "pattern", "checkers"); break; 253 + case T_BOARD_SB_CHECKERS: cJSON_AddStringToObject(scene, "pattern", "sb_checkers"); break; 254 + case T_BOARD_CIRCLES: cJSON_AddStringToObject(scene, "pattern", "circles"); break; 255 + case T_BOARD_ASYMMETRIC_CIRCLES: cJSON_AddStringToObject(scene, "pattern", "asymmetric_circles"); break; 256 + } 257 + 258 + { 259 + struct cJSON *pat = cJSON_AddObjectToObject(scene, "checkers"); 260 + cJSON_AddNumberToObject(pat, "cols", p->checkers.cols); 261 + cJSON_AddNumberToObject(pat, "rows", p->checkers.rows); 262 + cJSON_AddNumberToObject(pat, "size_meters", p->checkers.size_meters); 263 + cJSON_AddBoolToObject(pat, "subpixel_enable", p->checkers.subpixel_enable); 264 + cJSON_AddNumberToObject(pat, "subpixel_size", p->checkers.subpixel_size); 265 + } 266 + 267 + { 268 + struct cJSON *pat = cJSON_AddObjectToObject(scene, "sb_checkers"); 269 + cJSON_AddNumberToObject(pat, "cols", p->sb_checkers.cols); 270 + cJSON_AddNumberToObject(pat, "rows", p->sb_checkers.rows); 271 + cJSON_AddNumberToObject(pat, "size_meters", p->sb_checkers.size_meters); 272 + cJSON_AddBoolToObject(pat, "marker", p->sb_checkers.marker); 273 + cJSON_AddBoolToObject(pat, "normalize_image", p->sb_checkers.normalize_image); 274 + } 275 + 276 + { 277 + struct cJSON *pat = cJSON_AddObjectToObject(scene, "circles"); 278 + cJSON_AddNumberToObject(pat, "cols", p->circles.cols); 279 + cJSON_AddNumberToObject(pat, "rows", p->circles.rows); 280 + cJSON_AddNumberToObject(pat, "distance_meters", p->circles.distance_meters); 281 + } 282 + 283 + { 284 + struct cJSON *pat = cJSON_AddObjectToObject(scene, "asymmetric_circles"); 285 + cJSON_AddNumberToObject(pat, "cols", p->asymmetric_circles.cols); 286 + cJSON_AddNumberToObject(pat, "rows", p->asymmetric_circles.rows); 287 + cJSON_AddNumberToObject(pat, "diagonal_distance_meters", 288 + p->asymmetric_circles.diagonal_distance_meters); 289 + } 290 + *out_json = scene; 291 + } 292 + 293 + void 294 + t_calibration_gui_params_default(struct t_calibration_params *p) 295 + { 296 + // Camera config. 297 + p->use_fisheye = false; 298 + p->stereo_sbs = true; 299 + 300 + // Which board should we calibrate against. 301 + p->pattern = T_BOARD_CHECKERS; 302 + 303 + // Checker board. 304 + p->checkers.cols = 9; 305 + p->checkers.rows = 7; 306 + p->checkers.size_meters = 0.025f; 307 + p->checkers.subpixel_enable = true; 308 + p->checkers.subpixel_size = 5; 309 + 310 + // Sector based checker board. 311 + p->sb_checkers.cols = 14; 312 + p->sb_checkers.rows = 9; 313 + p->sb_checkers.size_meters = 0.01206f; 314 + p->sb_checkers.marker = false; 315 + p->sb_checkers.normalize_image = false; 316 + 317 + // Symmetrical circles. 318 + p->circles.cols = 9; 319 + p->circles.rows = 7; 320 + p->circles.distance_meters = 0.025f; 321 + 322 + // Asymmetrical circles. 323 + p->asymmetric_circles.cols = 5; 324 + p->asymmetric_circles.rows = 17; 325 + p->asymmetric_circles.diagonal_distance_meters = 0.02f; 326 + 327 + // Loading of images. 328 + p->load.enabled = false; 329 + p->load.num_images = 20; 330 + 331 + // Frame collection info. 332 + p->num_cooldown_frames = 20; 333 + p->num_wait_for = 5; 334 + p->num_collect_total = 20; 335 + p->num_collect_restart = 1; 336 + 337 + // Misc. 338 + p->mirror_rgb_image = false; 339 + p->save_images = true; 340 + } 341 + 342 + void 343 + t_calibration_gui_params_load_or_default(struct t_calibration_params *p) 344 + { 345 + t_calibration_gui_params_default(p); 346 + 347 + // Load defaults from file, if it exists. This overwrites the above 348 + struct u_config_json config_json = {0}; 349 + 350 + u_gui_state_open_file(&config_json); 351 + 352 + if (config_json.root != NULL) { 353 + struct cJSON *scene = u_gui_state_get_scene(&config_json, GUI_STATE_SCENE_CALIBRATE); 354 + t_calibration_gui_params_parse_from_json(scene, p); 355 + } 356 + }
+8 -45
src/xrt/auxiliary/tracking/t_tracking.h
··· 496 496 * Sets the calibration parameters to the their default values. 497 497 * @public @memberof t_calibration_params 498 498 */ 499 - static inline void 500 - t_calibration_params_default(struct t_calibration_params *p) 501 - { 502 - // Camera config. 503 - p->use_fisheye = false; 504 - p->stereo_sbs = true; 499 + void 500 + t_calibration_gui_params_default(struct t_calibration_params *p); 505 501 506 - // Which board should we calibrate against. 507 - p->pattern = T_BOARD_CHECKERS; 502 + void 503 + t_calibration_gui_params_load_or_default(struct t_calibration_params *p); 508 504 509 - // Checker board. 510 - p->checkers.cols = 9; 511 - p->checkers.rows = 7; 512 - p->checkers.size_meters = 0.025f; 513 - p->checkers.subpixel_enable = true; 514 - p->checkers.subpixel_size = 5; 505 + void 506 + t_calibration_gui_params_to_json(struct cJSON **out_json, struct t_calibration_params *p); 515 507 516 - // Sector based checker board. 517 - p->sb_checkers.cols = 14; 518 - p->sb_checkers.rows = 9; 519 - p->sb_checkers.size_meters = 0.01206f; 520 - p->sb_checkers.marker = false; 521 - p->sb_checkers.normalize_image = false; 522 - 523 - // Symmetrical circles. 524 - p->circles.cols = 9; 525 - p->circles.rows = 7; 526 - p->circles.distance_meters = 0.025f; 527 - 528 - // Asymmetrical circles. 529 - p->asymmetric_circles.cols = 5; 530 - p->asymmetric_circles.rows = 17; 531 - p->asymmetric_circles.diagonal_distance_meters = 0.02f; 532 - 533 - // Loading of images. 534 - p->load.enabled = false; 535 - p->load.num_images = 20; 536 - 537 - // Frame collection info. 538 - p->num_cooldown_frames = 20; 539 - p->num_wait_for = 5; 540 - p->num_collect_total = 20; 541 - p->num_collect_restart = 1; 542 - 543 - // Misc. 544 - p->mirror_rgb_image = false; 545 - p->save_images = true; 546 - } 508 + void 509 + t_calibration_gui_params_parse_from_json(const struct cJSON *params, struct t_calibration_params *p); 547 510 548 511 /*! 549 512 * @brief Create the camera calibration frame sink.
+9 -1
src/xrt/state_trackers/gui/gui_scene_calibrate.c
··· 314 314 return; 315 315 } 316 316 317 + struct u_config_json config_json; 318 + u_gui_state_open_file(&config_json); 319 + 320 + struct cJSON *new_state; 321 + t_calibration_gui_params_to_json(&new_state, &cs->params); 322 + 323 + u_gui_state_save_scene(&config_json, GUI_STATE_SCENE_CALIBRATE, new_state); 324 + 317 325 cs->base.render = scene_render_video; 318 326 319 327 struct xrt_frame_sink *rgb = NULL; ··· 401 409 cs->settings = s; 402 410 403 411 #ifdef XRT_HAVE_OPENCV 404 - t_calibration_params_default(&cs->params); 412 + t_calibration_gui_params_load_or_default(&cs->params); 405 413 406 414 /* 407 415 * Pre-quirk some known cameras.