use calib_targets_aruco::Dictionary;
use calib_targets_charuco::MarkerLayout;
use calib_targets_print::{
CharucoTargetSpec, ChessboardTargetSpec, MarkerBoardTargetSpec, MarkerCircleSpec,
PrintableTargetDocument, PuzzleBoardTargetSpec, TargetSpec,
};
pub fn chessboard_document(
inner_rows: u32,
inner_cols: u32,
square_size_mm: f64,
) -> PrintableTargetDocument {
PrintableTargetDocument::new(TargetSpec::Chessboard(ChessboardTargetSpec {
inner_rows,
inner_cols,
square_size_mm,
}))
}
pub fn charuco_document(
rows: u32,
cols: u32,
square_size_mm: f64,
marker_size_rel: f64,
dictionary: Dictionary,
) -> PrintableTargetDocument {
PrintableTargetDocument::new(TargetSpec::Charuco(CharucoTargetSpec {
rows,
cols,
square_size_mm,
marker_size_rel,
dictionary,
marker_layout: MarkerLayout::default(),
border_bits: 1,
}))
}
pub fn puzzleboard_document(rows: u32, cols: u32, square_size_mm: f64) -> PrintableTargetDocument {
PrintableTargetDocument::new(TargetSpec::PuzzleBoard(PuzzleBoardTargetSpec {
rows,
cols,
square_size_mm,
origin_row: 0,
origin_col: 0,
dot_diameter_rel: 1.0 / 3.0,
}))
}
pub fn marker_board_document(
inner_rows: u32,
inner_cols: u32,
square_size_mm: f64,
) -> PrintableTargetDocument {
marker_board_document_with_circles(
inner_rows,
inner_cols,
square_size_mm,
MarkerBoardTargetSpec::default_circles(inner_rows, inner_cols),
)
}
pub fn marker_board_document_with_circles(
inner_rows: u32,
inner_cols: u32,
square_size_mm: f64,
circles: [MarkerCircleSpec; 3],
) -> PrintableTargetDocument {
PrintableTargetDocument::new(TargetSpec::MarkerBoard(MarkerBoardTargetSpec {
inner_rows,
inner_cols,
square_size_mm,
circles,
circle_diameter_rel: 0.5,
}))
}
#[cfg(test)]
mod tests {
use super::*;
use calib_targets_aruco::builtins::builtin_dictionary;
fn round_trip(doc: &PrintableTargetDocument) {
doc.validate().expect("validate");
let json = doc.to_json_pretty().expect("to_json");
let parsed: PrintableTargetDocument = serde_json::from_str(&json).expect("from_json");
parsed.validate().expect("re-validate");
assert_eq!(doc, &parsed);
}
#[test]
fn chessboard_helper_produces_valid_document() {
let doc = chessboard_document(6, 8, 20.0);
round_trip(&doc);
assert_eq!(doc.target.kind_name(), "chessboard");
}
#[test]
fn charuco_helper_produces_valid_document() {
let dict = builtin_dictionary("DICT_4X4_50").expect("dict");
let doc = charuco_document(5, 7, 20.0, 0.75, dict);
round_trip(&doc);
assert_eq!(doc.target.kind_name(), "charuco");
}
#[test]
fn puzzleboard_helper_produces_valid_document() {
let doc = puzzleboard_document(10, 12, 15.0);
round_trip(&doc);
assert_eq!(doc.target.kind_name(), "puzzleboard");
}
#[test]
fn marker_board_helper_produces_valid_document() {
let doc = marker_board_document(6, 8, 20.0);
round_trip(&doc);
assert_eq!(doc.target.kind_name(), "marker_board");
}
}