#![feature(array_chunks)] //! note that image doesnt support in-place transformations. use fimg::Image; use image::{imageops, RgbImage}; use opencv::{core::CV_8UC3, prelude::*}; const SIZE: u32 = 5424; // dont have to alloc, but it would be less fair. pub fn fimg() -> Image, 3> { Image::build(SIZE, SIZE).buf(iai::black_box(include_bytes!("../data.imgbuf").to_vec())) } pub fn opencv() -> Mat { opencv::core::set_num_threads(1).unwrap(); let mut data = iai::black_box(include_bytes!("../data.imgbuf").to_vec()) .array_chunks::<3>() .flat_map(|&[r, g, b]| [b, g, r]) .collect::>(); let mat = unsafe { Mat::new_size_with_data_def( opencv::core::Size_ { width: SIZE as i32, height: SIZE as i32, }, CV_8UC3, data.as_mut_ptr() as *mut core::ffi::c_void, ) .unwrap() }; std::mem::forget(data); mat } pub fn o_opencv() -> Mat { unsafe { Mat::new_rows_cols(SIZE as i32, SIZE as i32, CV_8UC3).unwrap() } } pub fn ipimg() -> RgbImage { RgbImage::from_raw( SIZE, SIZE, iai::black_box(include_bytes!("../data.imgbuf").to_vec()), ) .unwrap() } pub fn rot_90_fimg() { iai::black_box(unsafe { fimg().cloner().rot_90() }); } pub fn rot_90_imgproc() { iai::black_box(imageops::rotate90(&ipimg())); } pub fn rot_90_opencv() { let mut o = o_opencv(); opencv::core::rotate(&opencv(), &mut o, 0).unwrap(); iai::black_box(o); } pub fn rot_180_fimg() { iai::black_box(fimg().cloner().rot_180()); } pub fn rot_180_imgproc() { iai::black_box(imageops::rotate180(&ipimg())); } pub fn rot_180_opencv() { let mut o = o_opencv(); opencv::core::rotate(&opencv(), &mut o, 1).unwrap(); iai::black_box(o); } pub fn rot_270_fimg() { iai::black_box(unsafe { fimg().cloner().rot_270() }); } pub fn rot_270_imgproc() { iai::black_box(imageops::rotate270(&ipimg())); } pub fn rot_270_opencv() { let mut o = o_opencv(); opencv::core::rotate(&opencv(), &mut o, -1).unwrap(); iai::black_box(o); } pub fn flip_h_fimg() { iai::black_box(fimg().cloner().flip_h()); } pub fn flip_h_imgproc() { iai::black_box(imageops::flip_horizontal(&ipimg())); } pub fn flip_h_opencv() { let mut o = o_opencv(); opencv::core::flip(&opencv(), &mut o, 1).unwrap(); iai::black_box(o); } pub fn flip_v_fimg() { iai::black_box(fimg().cloner().flip_h()); } pub fn flip_v_imgproc() { iai::black_box(imageops::flip_vertical(&ipimg())); } pub fn flip_v_opencv() { let mut o = o_opencv(); opencv::core::flip(&opencv(), &mut o, 0).unwrap(); iai::black_box(o); } iai::main!( rot_90_fimg, rot_90_imgproc, rot_90_opencv, rot_180_fimg, rot_180_imgproc, rot_180_opencv, rot_270_fimg, rot_270_imgproc, rot_270_opencv, flip_h_fimg, flip_h_imgproc, flip_h_opencv, flip_v_fimg, flip_v_imgproc, flip_v_opencv, );