use crate::prelude::*;
use sophus_core::params::ParamsImpl;
use sophus_image::ImageSize;
pub trait IsCameraDistortionImpl<
S: IsScalar<BATCH>,
const DISTORT: usize,
const PARAMS: usize,
const BATCH: usize,
>: ParamsImpl<S, PARAMS, BATCH>
{
fn identity_params() -> S::Vector<PARAMS> {
let mut params = S::Vector::<PARAMS>::zeros();
params.set_elem(0, S::ones());
params.set_elem(1, S::ones());
params
}
fn distort(
params: &S::Vector<PARAMS>,
proj_point_in_camera_z1_plane: &S::Vector<2>,
) -> S::Vector<2>;
fn undistort(params: &S::Vector<PARAMS>, distorted_point: &S::Vector<2>) -> S::Vector<2>;
fn dx_distort_x(
params: &S::Vector<PARAMS>,
proj_point_in_camera_z1_plane: &S::Vector<2>,
) -> S::Matrix<2, 2>;
}
pub trait IsProjection<S: IsScalar<BATCH>, const BATCH: usize> {
fn proj(point_in_camera: &S::Vector<3>) -> S::Vector<2>;
fn unproj(point_in_camera: &S::Vector<2>, extension: S) -> S::Vector<3>;
fn dx_proj_x(point_in_camera: &S::Vector<3>) -> S::Matrix<2, 3>;
}
pub trait IsCameraEnum<S: IsScalar<BATCH>, const BATCH: usize> {
fn new_pinhole(params: &S::Vector<4>, image_size: ImageSize) -> Self;
fn new_kannala_brandt(params: &S::Vector<8>, image_size: ImageSize) -> Self;
fn image_size(&self) -> ImageSize;
fn cam_proj(&self, point_in_camera: &S::Vector<3>) -> S::Vector<2>;
fn cam_unproj_with_z(&self, pixel: &S::Vector<2>, z: S) -> S::Vector<3>;
fn distort(&self, proj_point_in_camera_z1_plane: &S::Vector<2>) -> S::Vector<2>;
fn undistort(&self, pixel: &S::Vector<2>) -> S::Vector<2>;
fn dx_distort_x(&self, proj_point_in_camera_z1_plane: &S::Vector<2>) -> S::Matrix<2, 2>;
}
pub trait IsPerspectiveCameraEnum<S: IsScalar<BATCH>, const BATCH: usize> {
fn pinhole_params(&self) -> S::Vector<4>;
}