use image::Rgba;
use imageproc::drawing::draw_line_segment_mut;
use oneocr_rs::{OcrEngine, OcrOptions, OneOcrError};
use std::path::Path;
fn main() -> Result<(), OneOcrError> {
let input_image_path = std::env::args()
.nth(1)
.unwrap_or("./assets/sample.jpg".to_string());
let output_image_path = std::env::args()
.nth(2)
.unwrap_or("./target/bbox_draw_output.jpg".to_string());
let input_image_path = Path::new(&input_image_path);
let output_image_path = Path::new(&output_image_path);
let options = OcrOptions {
include_word_level_details: true,
..Default::default()
};
let ocr_engine = OcrEngine::new_with_options(options)?;
ocr_engine.set_max_recognition_line_count(1000)?;
let ocr_result = ocr_engine.run(input_image_path.into())?;
let mut img = image::open(input_image_path)?;
let line_color = Rgba([255u8, 0u8, 0u8, 255u8]); let word_color = Rgba([0u8, 255u8, 0u8, 255u8]);
for line in &ocr_result.lines {
let line_bbox = line.bounding_box;
let p1 = (line_bbox.top_left.x, line_bbox.top_left.y);
let p2 = (line_bbox.top_right.x, line_bbox.top_right.y);
let p3 = (line_bbox.bottom_right.x, line_bbox.bottom_right.y);
let p4 = (line_bbox.bottom_left.x, line_bbox.bottom_left.y);
draw_line_segment_mut(&mut img, p1, p2, line_color);
draw_line_segment_mut(&mut img, p2, p3, line_color);
draw_line_segment_mut(&mut img, p3, p4, line_color);
draw_line_segment_mut(&mut img, p4, p1, line_color);
if let Some(words) = &line.words {
for word in words {
let word_bbox = word.bounding_box;
let wp1 = (word_bbox.top_left.x, word_bbox.top_left.y);
let wp2 = (word_bbox.top_right.x, word_bbox.top_right.y);
let wp3 = (word_bbox.bottom_right.x, word_bbox.bottom_right.y);
let wp4 = (word_bbox.bottom_left.x, word_bbox.bottom_left.y);
draw_line_segment_mut(&mut img, wp1, wp2, word_color);
draw_line_segment_mut(&mut img, wp2, wp3, word_color);
draw_line_segment_mut(&mut img, wp3, wp4, word_color);
draw_line_segment_mut(&mut img, wp4, wp1, word_color); }
}
}
img.save(output_image_path)?;
println!(
"Output image saved to: {}",
output_image_path.to_string_lossy()
);
Ok(())
}