@@ -310,62 +310,13 @@ Eigen::Matrix<double, 2, Eigen::Dynamic, Eigen::RowMajor> _dq_db_projection_unce
310310}
311311
312312double _observed_pixel_uncertainty_from_inputs (
313- const std::vector<double > &intrinsics,
314- const std::vector<mrcal_pose_t > &rt_ref_frame,
315- const mrcal_observation_board_t *observations_board,
316- const mrcal_point3_t *observations_board_pool,
317- int Nobservations_board,
318- const mrcal_lensmodel_t *lensmodel,
319- const mrcal_problem_selections_t &problem_selections,
320- int calibration_object_width_n,
321- int calibration_object_height_n,
322- double calibration_object_spacing)
313+ std::vector<double > &x, int num_measurements_board, int measurement_index_board)
323314{
324- int Nstate = mrcal_num_states (
325- 1 , 0 , rt_ref_frame.size (), 0 , 0 ,
326- Nobservations_board, problem_selections, lensmodel);
327-
328- int Nmeasurements_boards = mrcal_num_measurements (
329- Nobservations_board, 0 ,
330- NULL , 0 ,
331- calibration_object_width_n, calibration_object_height_n,
332- 1 , 0 , 6 , 0 , 0 , problem_selections, lensmodel);
333-
334- std::vector<double > b_packed (Nstate);
335- std::vector<double > x (Nmeasurements_boards);
336-
337- double point_min_range = -1.0 , point_max_range = -1.0 ;
338- mrcal_problem_constants_t problem_constants = {
339- .point_min_range = point_min_range, .point_max_range = point_max_range};
340-
341- bool ret = mrcal_optimizer_callback (
342- b_packed.data (), Nstate,
343- x.data (), Nmeasurements_boards,
344- nullptr , // no Jacobian needed
345- intrinsics.data (),
346- nullptr , rt_ref_frame.data (),
347- nullptr , nullptr ,
348- 1 , 0 , static_cast <int >(rt_ref_frame.size ()),
349- 0 , 0 ,
350- observations_board, nullptr ,
351- Nobservations_board, 0 ,
352- nullptr , 0 ,
353- observations_board_pool, nullptr ,
354- lensmodel, nullptr ,
355- problem_selections, &problem_constants,
356- calibration_object_spacing,
357- calibration_object_width_n, calibration_object_height_n,
358- false );
359-
360- if (!ret)
361- {
362- throw std::runtime_error (" mrcal_optimizer_callback failed" );
363- }
364-
365315 // Compute variance from residuals
366316 double sum = 0.0 , sum_sq = 0.0 ;
367- for (double val : x )
317+ for (size_t i = measurement_index_board; i < measurement_index_board + num_measurements_board; i++ )
368318 {
319+ double val = x[i];
369320 sum += val;
370321 sum_sq += val * val;
371322 }
@@ -427,16 +378,18 @@ double _propagate_calibration_uncertainty(
427378 1 , 0 , rt_ref_frame.size (), 0 , 0 ,
428379 Nobservations_board, problem_selections, &lensmodel);
429380
430- int Nmeasurements_boards = mrcal_num_measurements (
431- Nobservations_board, 0 ,
381+ int Nmeasurements = mrcal_num_measurements (
382+ Nobservations_board, 0 ,
432383 NULL , 0 ,
433384 calibration_object_width_n, calibration_object_height_n,
434385 1 , 0 , 6 , 0 , 0 , problem_selections, &lensmodel);
386+ int Nmeasurements_boards = mrcal_num_measurements_boards (
387+ Nobservations_board,
388+ calibration_object_width_n, calibration_object_height_n);
389+ int imeas0 = mrcal_measurement_index_boards (0 , Nobservations_board, 0 , calibration_object_width_n, calibration_object_height_n);
435390
436391 // Allocate buffers for Jt sparse matrix
437- int Nmeasurements = Nmeasurements_boards; // Total measurements (boards only for now)
438392 int N_j_nonzero = Nstate * Nmeasurements; // Upper bound, actual will be less
439-
440393 std::vector<int32_t > Jt_p (Nmeasurements + 1 );
441394 std::vector<int32_t > Jt_i (N_j_nonzero);
442395 std::vector<double_t > Jt_x (N_j_nonzero);
@@ -468,15 +421,15 @@ double _propagate_calibration_uncertainty(
468421 cholmod_start (&common);
469422
470423 // TODO fill this in
471- mrcal_calobject_warp_t warp { .x2 = 0.0 , .y2 = 0.0 };
424+ mrcal_calobject_warp_t warp{ .x2 = 0.0 , .y2 = 0.0 };
472425
473426 // TODO fill this in
474- int imagersize[2 ] {1280 , 720 };
427+ int imagersize[2 ]{1280 , 720 };
475428
476429 bool ret = mrcal_optimizer_callback (
477430 b_packed.data (), b_packed.size () * sizeof (double ), // out
478- x.data (), x.size () * sizeof (double ), // out
479- &Jt, // Get the Jacobian
431+ x.data (), x.size () * sizeof (double ), // out
432+ &Jt, // Get the Jacobian
480433 // IN parameters
481434 intrinsics.data (),
482435 nullptr , // no extrinsics
@@ -501,11 +454,7 @@ double _propagate_calibration_uncertainty(
501454 throw std::runtime_error (" mrcal_optimizer_callback failed" );
502455 }
503456
504- double observed_pixel_uncertainty = _observed_pixel_uncertainty_from_inputs (
505- intrinsics, rt_ref_frame, observations_board, observations_board_pool,
506- Nobservations_board, &lensmodel, problem_selections,
507- calibration_object_width_n, calibration_object_height_n,
508- calibration_object_spacing);
457+ double observed_pixel_uncertainty = _observed_pixel_uncertainty_from_inputs (x, Nmeasurements_boards, imeas0);
509458
510459 // Create factorization from Jt
511460 cholmod_factor *factorization = create_factorization (&Jt, &common);
@@ -629,7 +578,7 @@ bool projection_uncertainty(mrcal_point3_t pcam,
629578 auto dq_db{_dq_db_projection_uncertainty (pcam, lensmodel, rt_ref_frames, Nstate, istate_frames0, intrinsics)};
630579
631580 return _propagate_calibration_uncertainty (dq_db, problem_selections, lensmodel,
632- intrinsics, rt_ref_frames, c_observations_board, reinterpret_cast <const mrcal_point3_t *>(observations_board.data ()),
581+ intrinsics, rt_ref_frames, c_observations_board, reinterpret_cast <const mrcal_point3_t *>(observations_board.data ()),
633582 rt_ref_frames.size (), calibration_object_width_n_example, calibration_object_height_n_example, calibration_object_spacing_example);
634583}
635584
0 commit comments