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
),
}
}