chess-corners 1.0.0

High-level chessboard / ChESS corner detection API
Documentation
//! Single-scale ChESS detection on a grayscale image.
//!
//! Usage:
//!   cargo run -p chess-corners --example single_scale_image -- path/to/image.png

use chess_corners::{CornerDescriptor, Detector, DetectorConfig};
use image::ImageReader;
use std::env;
use std::error::Error;
use std::path::PathBuf;

fn main() -> Result<(), Box<dyn Error>> {
    let img_path = env::args()
        .nth(1)
        .map(PathBuf::from)
        .unwrap_or_else(|| PathBuf::from("testimages/mid.png"));

    let img = ImageReader::open(&img_path)?.decode()?.to_luma8();

    let cfg = DetectorConfig::chess();

    let mut detector = Detector::new(cfg)?;
    let corners = detector.detect(&img)?;
    println!("image: {}", img_path.display());
    println!("found {} corners", corners.len());

    if let Some(best) = corners
        .iter()
        .max_by(|a, b| a.response.partial_cmp(&b.response).unwrap())
    {
        print_corner("strongest corner", best);
    }

    Ok(())
}

fn print_corner(label: &str, c: &CornerDescriptor) {
    match c.axes {
        Some(axes) => println!(
            "{label}: ({:.2}, {:.2}), response {:.1}, axes [{:.2} ± {:.3}, {:.2} ± {:.3}] rad",
            c.x, c.y, c.response, axes[0].angle, axes[0].sigma, axes[1].angle, axes[1].sigma
        ),
        None => println!(
            "{label}: ({:.2}, {:.2}), response {:.1}, axes skipped",
            c.x, c.y, c.response
        ),
    }
}