Crate opencv_ros_camera for the Rust language

Crates.io MIT/Apache docs.rs

Geometric models of OpenCV/ROS cameras for photogrammetry

About

This crate provides a geometric model of a camera compatible with OpenCV as used by ROS (the Robot Operating System). The crate is in pure Rust, can be compiled in no_std mode, implements the IntrinsicsParameters trait from the cam-geom and provides support to read and write camera models in various formats.

In greater detail:

Example - read a ROS YAML file and create a cam_geom::Camera from it.

Let's say we have YAML file saved by the ROS camera_calibration/cameracalibrator.py node. How can we create a cam_geom::Camera from this?

```rust use nalgebra::{Matrix2x3, Unit, Vector3};

// Here we have the YAML file contents hardcoded in a string. Ordinarily, you // would read this from a file such as ~/.ros/camera_info/camera_name.yaml, but // for this example, it is hardcoded here. let yamlbuf = b"imagewidth: 659 imageheight: 494 cameraname: Basler21029382 cameramatrix: rows: 3 cols: 3 data: [516.385667640757, 0, 339.167079537312, 0, 516.125799367807, 227.37993524141, 0, 0, 1] distortionmodel: plumbbob distortioncoefficients: rows: 1 cols: 5 data: [-0.331416226762003, 0.143584747015566, 0.00314558656668844, -0.00393597842852019, 0] rectificationmatrix: rows: 3 cols: 3 data: [1, 0, 0, 0, 1, 0, 0, 0, 1] projection_matrix: rows: 3 cols: 4 data: [444.369750976562, 0, 337.107817516087, 0, 0, 474.186859130859, 225.062742824321, 0, 0, 0, 1, 0]";

// The ROS YAML file does not contain the pose (no extrinsic parameters). Here we // specify them directly. The camera is at (10,0,0), looing at (0,0,0), with up (0,0,1). let camcenter = Vector3::new(10.0, 0.0, 0.0); let lookat = Vector3::new(0.0, 0.0, 0.0); let up = Unit::newnormalize(Vector3::new(0.0, 0.0, 1.0)); let pose = camgeom::ExtrinsicParameters::from_view(&camcenter, &lookat, &up);

// We need the serde-serialize feature for the from_ros_yaml function.

[cfg(feature = "serde-serialize")]

{ let fromros = opencvroscamera::fromrosyaml(&yamlbuf[..]).unwrap();

// Finally, create camera from intrinsic and extrinsic parameters.
let camera = cam_geom::Camera::new(from_ros.intrinsics, pose);

} ```

testing

Test no_std compilation with:

```

install target with: "rustup target add thumbv7em-none-eabihf"

cargo check --no-default-features --target thumbv7em-none-eabihf ```

Run unit tests with:

cargo test --features std cargo test --features serde-serialize

serde support requires std.

re-render README.md

cargo install cargo-readme cargo readme > README.md

==========================================================

Code of conduct

Anyone who interacts with this software in any space, including but not limited to this GitHub repository, must follow our code of conduct.

License

Licensed under either of these: