use std::time::Instant;
#[cfg(feature = "logger")]
use env_logger::Builder;
#[cfg(feature = "logger")]
use log::info;
#[cfg(feature = "imagers")]
use image::{imageops::blur, open};
#[cfg(feature = "opencv")]
use opencv::{core::Mat, imgcodecs, imgproc, prelude::*};
use subpixel_edge::{canny_based_subpixel_edges_optimized, visualize_edges};
#[cfg(feature = "imagers")]
fn main() {
#[cfg(feature = "logger")]
Builder::from_default_env().format_timestamp_nanos().init();
let img = open("test_image/edge-small.png").unwrap().to_luma8();
let blur = blur(&img, 1.0);
#[cfg(feature = "logger")]
info!("start cal");
let instance = Instant::now();
let edges = canny_based_subpixel_edges_optimized(&blur, 20.0, 80.0, 0.6);
let elapsed = instance.elapsed();
#[cfg(feature = "logger")]
info!("检测耗时: {elapsed:?}");
let result = visualize_edges(&img, &edges);
result.save("test_image/subpixel_edges.png").unwrap();
#[cfg(feature = "logger")]
info!("检测到 {} 个亚像素边缘点", edges.len());
#[cfg(not(feature = "logger"))]
println!("检测到 {} 个亚像素边缘点,耗时: {:?}", edges.len(), elapsed);
}
#[cfg(feature = "opencv")]
fn main() {
#[cfg(feature = "logger")]
Builder::from_default_env().format_timestamp_nanos().init();
let img = imgcodecs::imread("test_image/edge-small.png", imgcodecs::IMREAD_GRAYSCALE).unwrap();
let mut blurred = Mat::default();
let ksize = opencv::core::Size::new(7, 7);
imgproc::gaussian_blur(
&img,
&mut blurred,
ksize,
3.0,
3.0,
opencv::core::BORDER_DEFAULT,
)
.unwrap();
#[cfg(feature = "logger")]
info!("start cal");
let instance = Instant::now();
let edges = canny_based_subpixel_edges_optimized(&blurred, 20.0, 80.0, 0.6);
let elapsed = instance.elapsed();
#[cfg(feature = "logger")]
info!("检测耗时: {elapsed:?}");
let result = visualize_edges(&img, &edges);
imgcodecs::imwrite(
"test_image/subpixel_edges.png",
&result,
&opencv::core::Vector::new(),
)
.unwrap();
#[cfg(feature = "logger")]
info!("检测到 {} 个亚像素边缘点", edges.len());
#[cfg(not(feature = "logger"))]
println!("检测到 {} 个亚像素边缘点,耗时: {:?}", edges.len(), elapsed);
}
#[cfg(not(any(feature = "imagers", feature = "opencv")))]
fn main() {
eprintln!("Error: You must enable either 'imagers' or 'opencv' feature to run this example.");
eprintln!("Try running with:");
eprintln!(" cargo run --example subpixel_edge_detection --features imagers,logger");
eprintln!(" or");
eprintln!(" cargo run --example subpixel_edge_detection --features opencv,logger");
}