opencv 0.76.3

Rust bindings for OpenCV
Documentation
#[cfg(ocvrs_opencv_branch_4)]
use opencv::core::AccessFlag::ACCESS_READ;
#[cfg(not(ocvrs_opencv_branch_4))]
use opencv::core::ACCESS_READ;
use opencv::{
	core::{Rect, Size, UMat, UMatUsageFlags, Vec3d},
	prelude::*,
	types::VectorOfi32,
	Result,
};

#[test]
fn umat_default() -> Result<()> {
	let mat = UMat::new(UMatUsageFlags::USAGE_DEFAULT);
	assert_eq!(u8::typ(), mat.typ());
	assert_eq!(u8::depth(), mat.depth());
	assert_eq!(u8::channels(), mat.channels());
	assert_eq!(Size::new(0, 0), mat.size()?);
	assert_eq!(0, mat.dims());
	Ok(())
}

#[test]
fn umat_create() -> Result<()> {
	let mut mat = UMat::new(UMatUsageFlags::USAGE_DEFAULT);
	unsafe { mat.create_rows_cols(10, 10, u16::typ(), UMatUsageFlags::USAGE_DEFAULT)? };
	assert_eq!(Size::new(10, 10), mat.size()?);
	assert_eq!(2, mat.dims());
	Ok(())
}

#[test]
fn umat_to_mat() -> Result<()> {
	{
		let mut vec = VectorOfi32::new();
		vec.push(1);
		vec.push(2);
		vec.push(3);
		let mat = Mat::from_exact_iter(vec.into_iter())?;
		let umat = mat.get_umat(ACCESS_READ, UMatUsageFlags::USAGE_DEFAULT)?;
		assert_eq!(3, umat.rows());
		assert_eq!(1, umat.cols());
		assert_eq!(i32::typ(), umat.typ());
		let mat = umat.get_mat(ACCESS_READ)?;
		assert_eq!(1, *mat.at_2d::<i32>(0, 0)?);
		assert_eq!(2, *mat.at_2d::<i32>(1, 0)?);
		assert_eq!(3, *mat.at_2d::<i32>(2, 0)?);
	}

	{
		let vec: Vec<i32> = vec![1, 2, 3];
		let mat = Mat::from_exact_iter(vec.into_iter())?;
		let umat = mat.get_umat(ACCESS_READ, UMatUsageFlags::USAGE_DEFAULT)?;
		assert_eq!(3, umat.rows());
		assert_eq!(1, umat.cols());
		assert_eq!(i32::typ(), umat.typ());
		let mat = umat.get_mat(ACCESS_READ)?;
		assert_eq!(1, *mat.at_2d::<i32>(0, 0)?);
		assert_eq!(2, *mat.at_2d::<i32>(1, 0)?);
		assert_eq!(3, *mat.at_2d::<i32>(2, 0)?);
	}
	Ok(())
}

#[test]
fn umat_for_rows_and_cols() -> Result<()> {
	let mat = unsafe { UMat::new_rows_cols(400, 300, Vec3d::typ(), UMatUsageFlags::USAGE_DEFAULT) }?;
	assert_eq!(Vec3d::typ(), mat.typ());
	assert_eq!(Vec3d::depth(), mat.depth());
	assert_eq!(Vec3d::channels(), mat.channels());
	assert!(mat.is_continuous());
	assert!(!mat.is_submatrix());
	assert_eq!(Size::new(300, 400), mat.size()?);
	assert_eq!(400, mat.rows());
	assert_eq!(300, mat.cols());
	assert_eq!(2, mat.mat_size().len());
	assert_eq!(400, mat.mat_size()[0]);
	assert_eq!(300, mat.mat_size()[1]);
	assert_eq!(2, mat.dims());
	assert_eq!(2, mat.mat_step().len());
	assert_eq!(7200, mat.mat_step()[0]);
	assert_eq!(24, mat.mat_step()[1]);
	assert_eq!(24, mat.elem_size()?);
	assert_eq!(8, mat.elem_size1());
	assert_eq!(900, mat.step1(0)?);
	assert_eq!(3, mat.step1(1)?);
	assert_eq!(120000, mat.total());
	Ok(())
}

#[test]
fn umat_continuous() -> Result<()> {
	let s: Vec<Vec<f32>> = vec![vec![1., 2., 3.], vec![4., 5., 6.], vec![7., 8., 9.]];

	let mat = Mat::from_slice_2d(&s)?;
	let umat = mat.get_umat(ACCESS_READ, UMatUsageFlags::USAGE_DEFAULT)?;

	{
		let sub_umat_non_cont = UMat::roi(&umat, Rect::new(1, 1, 2, 2))?;
		assert_eq!(umat.typ(), sub_umat_non_cont.typ());
		assert_eq!(2, sub_umat_non_cont.rows());
		assert_eq!(2, sub_umat_non_cont.cols());
		assert!(sub_umat_non_cont.is_submatrix());
		assert!(!sub_umat_non_cont.is_continuous());

		let umat_clone = sub_umat_non_cont.try_clone()?;
		assert_eq!(umat.typ(), umat_clone.typ());
		assert_eq!(2, umat_clone.rows());
		assert_eq!(2, umat_clone.cols());
		assert!(!umat_clone.is_submatrix());
		assert!(umat_clone.is_continuous());
	}

	{
		let sub_umat_cont = UMat::roi(&umat, Rect::new(0, 1, 3, 2))?;
		assert_eq!(umat.typ(), sub_umat_cont.typ());
		assert_eq!(2, sub_umat_cont.rows());
		assert_eq!(3, sub_umat_cont.cols());
		assert!(sub_umat_cont.is_submatrix());
		assert!(sub_umat_cont.is_continuous());
	}

	Ok(())
}