94 lines
3.0 KiB
Python
94 lines
3.0 KiB
Python
"""Shared CLI helpers for calibration scripts."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
from pathlib import Path
|
|
from typing import Dict, Optional, Tuple
|
|
|
|
import config
|
|
|
|
|
|
def parse_chessboard_size(value: str) -> Tuple[int, int]:
|
|
parts = value.split(",")
|
|
if len(parts) != 2:
|
|
raise argparse.ArgumentTypeError(
|
|
"chessboard size must be width,height (e.g. 8,7)"
|
|
)
|
|
return tuple(map(int, parts))
|
|
|
|
|
|
def add_session_args(parser: argparse.ArgumentParser) -> None:
|
|
parser.add_argument("--project", required=True, help="Project name (e.g. Olsen_wings)")
|
|
parser.add_argument("--date", required=True, help="Date string (e.g. 2026-05-12)")
|
|
parser.add_argument(
|
|
"--calib_name", default="calib1", help="Calibration folder name (default: calib1)"
|
|
)
|
|
|
|
|
|
def add_board_args(parser: argparse.ArgumentParser) -> None:
|
|
parser.add_argument(
|
|
"--chessboard_size",
|
|
type=parse_chessboard_size,
|
|
default="8,7",
|
|
help="Default inner corner grid width,height",
|
|
)
|
|
parser.add_argument(
|
|
"--square_size",
|
|
type=float,
|
|
default=0.045,
|
|
help="Default chessboard square size in metres",
|
|
)
|
|
parser.add_argument("--left_chessboard_size", type=parse_chessboard_size, default=None)
|
|
parser.add_argument("--right_chessboard_size", type=parse_chessboard_size, default=None)
|
|
parser.add_argument("--left_square_size", type=float, default=None)
|
|
parser.add_argument("--right_square_size", type=float, default=None)
|
|
parser.add_argument(
|
|
"--preprocessing",
|
|
type=str,
|
|
default="None",
|
|
help="Pre-detection chain: G=gray, C=CLAHE, T=threshold (e.g. C, GC)",
|
|
)
|
|
|
|
|
|
def add_troubleshooting_arg(parser: argparse.ArgumentParser) -> None:
|
|
parser.add_argument(
|
|
"--troubleshooting",
|
|
action="store_true",
|
|
help=(
|
|
"Verbose logs and intermediate debug files (corners/, pairing_reports/, "
|
|
"rectified/). Default: minimal logs; step 2 writes only params/"
|
|
),
|
|
)
|
|
|
|
|
|
def resolve_input_path(args) -> Path:
|
|
return config.CALIB_DATA_DIR / args.project / args.date / args.calib_name
|
|
|
|
|
|
def build_board_config(args) -> Tuple[Dict[str, Tuple[int, int]], Dict[str, float]]:
|
|
default_board = args.chessboard_size
|
|
default_square = args.square_size
|
|
left_board = args.left_chessboard_size or default_board
|
|
right_board = args.right_chessboard_size or default_board
|
|
left_square = args.left_square_size if args.left_square_size is not None else default_square
|
|
right_square = (
|
|
args.right_square_size if args.right_square_size is not None else default_square
|
|
)
|
|
|
|
board_sizes = {
|
|
"lc": left_board,
|
|
"lc-ir": left_board,
|
|
"rc": right_board,
|
|
"rg": right_board,
|
|
"ir": right_board,
|
|
}
|
|
square_sizes = {
|
|
"lc": left_square,
|
|
"lc-ir": left_square,
|
|
"rc": right_square,
|
|
"rg": right_square,
|
|
"ir": right_square,
|
|
}
|
|
return board_sizes, square_sizes
|