Skip to content

Commit

Permalink
flytrax-csv-to-braidz: do not require opencv
Browse files Browse the repository at this point in the history
  • Loading branch information
astraw committed Oct 2, 2024
1 parent 5a35b44 commit e784833
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 44 deletions.
4 changes: 2 additions & 2 deletions .gitlab-ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ test_crates:

# flytrax-csv-to-braidz, which requires opencv
- cd flytrax-csv-to-braidz
- PKG_CONFIG_PATH=/opt/opencv-4.9.0-static/lib/pkgconfig OPENCV_STATIC=1 cargo test --release
- PKG_CONFIG_PATH=/opt/opencv-4.9.0-static/lib/pkgconfig OPENCV_STATIC=1 cargo test --release --features "with_apriltags"
- cd ..

# Test freemovr-calibration, which requires opencv
Expand Down Expand Up @@ -795,7 +795,7 @@ flytrax-csv-to-braidz-binary:
- export RUSTFLAGS="-D warnings"

- cd $CI_PROJECT_DIR/flytrax-csv-to-braidz
- OPENCV_STATIC=1 PKG_CONFIG_PATH=/opt/opencv-4.9.0-static/lib/pkgconfig cargo build --release
- OPENCV_STATIC=1 PKG_CONFIG_PATH=/opt/opencv-4.9.0-static/lib/pkgconfig cargo build --release --features "with_apriltags"

- mkdir -p $CI_PROJECT_DIR/build
- ldd $CI_PROJECT_DIR/target/release/flytrax-csv-to-braidz
Expand Down
3 changes: 2 additions & 1 deletion flytrax-csv-to-braidz/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ braidz-types = { path = "../braidz-types" }
braidz-parser = { path = "../braidz-parser" }
zip-or-dir = { path = "../zip-or-dir" }
braid-offline = { path = "../braid-offline", default-features = false }
flytrax-apriltags-calibration = { path = "../braid-april-cal/flytrax-apriltags-calibration" }
flytrax-apriltags-calibration = { path = "../braid-april-cal/flytrax-apriltags-calibration", optional = true }
flytrax-io = { path = "../strand-cam/flytrax-io" }

[dev-dependencies]
Expand All @@ -57,4 +57,5 @@ test-log = "0.2.12"
download-verify = { path = "../download-verify" }

[features]
with_apriltags = ["flytrax-apriltags-calibration"]
backtrace = ["flydra2/backtrace", "flydra-mvg/backtrace"]
98 changes: 57 additions & 41 deletions flytrax-csv-to-braidz/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ extern crate log;
use std::{
collections::BTreeMap,
io::{BufRead, Write},
path::PathBuf,
path::{Path, PathBuf},
};

use braid_offline::KalmanizeOptions;
Expand All @@ -24,6 +24,61 @@ enum CalibrationType {
FullCal(Box<FlydraMultiCameraSystem<f64>>),
}

#[cfg(not(feature = "with_apriltags"))]
fn load_yaml_calibration(
_: Option<ExtrinsicsArgs>,
_calibration_params_buf: &str,
_output_braidz: &Path,
) -> Result<CalibrationType> {
anyhow::bail!("Cannot use YAML calibration without apriltags support.");
}

#[cfg(feature = "with_apriltags")]
fn load_yaml_calibration(
eargs: Option<ExtrinsicsArgs>,
calibration_params_buf: &str,
output_braidz: &Path,
) -> Result<CalibrationType> {
let intrinsics: opencv_ros_camera::RosCameraInfo<f64> =
serde_yaml::from_str(&calibration_params_buf)?;
log::info!("loaded YAML intrinsics calibration");

let eargs = eargs.ok_or_else(|| {
anyhow::anyhow!("when loading YAML calibration, need apriltags_3d_fiducial_coords")
})?;

let args: flytrax_apriltags_calibration::ComputeExtrinsicsArgs =
flytrax_apriltags_calibration::ComputeExtrinsicsArgs {
apriltags_3d_fiducial_coords: eargs.apriltags_3d_fiducial_coords,
flytrax_csv: eargs.flytrax_csv,
image_filename: eargs.image_filename,
intrinsics,
};
let single_cam_result = flytrax_apriltags_calibration::compute_extrinsics(&args)?;

if let Some(dest_dir) = output_braidz.parent() {
std::fs::create_dir_all(dest_dir)?;
}

let mut out_svg_fname = std::path::PathBuf::from(output_braidz);
out_svg_fname.set_extension("braidz.svg");
flytrax_apriltags_calibration::save_cal_svg_and_png_images(out_svg_fname, &single_cam_result)?;

let system = single_cam_result.cal_result().cam_system.clone();

for camera_name in system.cams_by_name().keys() {
log::info!(
"Calibration result for {}: {:.2} pixel mean reprojection distance",
camera_name,
single_cam_result.cal_result().mean_reproj_dist[camera_name]
);
}

let full_cal = flydra_mvg::FlydraMultiCameraSystem::<f64>::from_system(system, None);

Ok(CalibrationType::FullCal(Box::new(full_cal)))
}

#[allow(clippy::too_many_arguments)]
async fn kalmanize_2d<R>(
mut point_detection_csv_reader: R,
Expand Down Expand Up @@ -57,46 +112,7 @@ where

CalibrationType::SimpleCal(pseudo)
} else if cal_file_name.ends_with(".yaml") {
let intrinsics: opencv_ros_camera::RosCameraInfo<f64> =
serde_yaml::from_str(&calibration_params_buf)?;
log::info!("loaded YAML intrinsics calibration");

let eargs = eargs.ok_or_else(|| {
anyhow::anyhow!("when loading YAML calibration, need apriltags_3d_fiducial_coords")
})?;

let args = flytrax_apriltags_calibration::ComputeExtrinsicsArgs {
apriltags_3d_fiducial_coords: eargs.apriltags_3d_fiducial_coords,
flytrax_csv: eargs.flytrax_csv,
image_filename: eargs.image_filename,
intrinsics,
};
let single_cam_result = flytrax_apriltags_calibration::compute_extrinsics(&args)?;

if let Some(dest_dir) = output_braidz.parent() {
std::fs::create_dir_all(dest_dir)?;
}

let mut out_svg_fname = std::path::PathBuf::from(output_braidz);
out_svg_fname.set_extension("braidz.svg");
flytrax_apriltags_calibration::save_cal_svg_and_png_images(
out_svg_fname,
&single_cam_result,
)?;

let system = single_cam_result.cal_result().cam_system.clone();

for camera_name in system.cams_by_name().keys() {
log::info!(
"Calibration result for {}: {:.2} pixel mean reprojection distance",
camera_name,
single_cam_result.cal_result().mean_reproj_dist[camera_name]
);
}

let full_cal = flydra_mvg::FlydraMultiCameraSystem::<f64>::from_system(system, None);

CalibrationType::FullCal(Box::new(full_cal))
load_yaml_calibration(eargs, &calibration_params_buf, output_braidz)?
} else {
anyhow::bail!("unrecognized file extension for calibration: \"{cal_file_name}\"");
};
Expand Down

0 comments on commit e784833

Please sign in to comment.