use nalgebra::{Matrix3, Point2, RealField};
use serde::{Deserialize, Serialize};
pub trait IntrinsicsModel<S: RealField + Copy> {
fn sensor_to_pixel(&self, sensor: &Point2<S>) -> Point2<S>;
fn pixel_to_sensor(&self, pixel: &Point2<S>) -> Point2<S>;
}
#[derive(Clone, Copy, Debug, Serialize, Deserialize)]
pub struct FxFyCxCySkew<S: RealField + Copy> {
pub fx: S,
pub fy: S,
pub cx: S,
pub cy: S,
pub skew: S,
}
impl<S: RealField + Copy> FxFyCxCySkew<S> {
pub fn k_matrix(&self) -> Matrix3<S> {
Matrix3::new(
self.fx,
self.skew,
self.cx,
S::zero(),
self.fy,
self.cy,
S::zero(),
S::zero(),
S::one(),
)
}
}
impl<S: RealField + Copy> IntrinsicsModel<S> for FxFyCxCySkew<S> {
fn sensor_to_pixel(&self, sensor: &Point2<S>) -> Point2<S> {
let u = self.fx * sensor.x + self.skew * sensor.y + self.cx;
let v = self.fy * sensor.y + self.cy;
Point2::new(u, v)
}
fn pixel_to_sensor(&self, pixel: &Point2<S>) -> Point2<S> {
let sy = (pixel.y - self.cy) / self.fy;
let sx = (pixel.x - self.cx - self.skew * sy) / self.fx;
Point2::new(sx, sy)
}
}