#计算机视觉 #视觉 #计算机 #摄影测量 #操作系统 #读取文件

无需 std opencv-ros-camera

用于摄影测量的OpenCV/ROS相机几何模型

22个版本 (14个破坏性版本)

0.15.0 2024年8月4日
0.14.1 2023年6月19日
0.14.0 2023年1月16日
0.13.2 2023年6月19日
0.2.1 2020年3月18日

#3机器人

Download history 217/week @ 2024-05-03 158/week @ 2024-05-10 164/week @ 2024-05-17 228/week @ 2024-05-24 285/week @ 2024-05-31 177/week @ 2024-06-07 282/week @ 2024-06-14 174/week @ 2024-06-21 111/week @ 2024-06-28 217/week @ 2024-07-05 179/week @ 2024-07-12 733/week @ 2024-07-19 384/week @ 2024-07-26 615/week @ 2024-08-02 301/week @ 2024-08-09 135/week @ 2024-08-16

每月 1,507 次下载

MIT/Apache

52KB
764

Rust语言 opencv_ros_camera 的Crate

Crates.io Documentation Crate License Dependency status build

用于摄影测量的OpenCV/ROS相机几何模型

关于

此Crate提供了一个与ROS(机器人操作系统)兼容的OpenCV相机的几何模型。该Crate使用纯Rust编写,可以在no_std模式下编译,实现了来自cam-geomIntrinsicParameters特质,并提供了读取和写入各种格式相机模型的支持。

更详细地

  • 兼容由ROS camera_calibration包制作的相机校准,包括单目立体校准。尽管具有这种兼容性,但不依赖于ROS或OpenCV。(此外,也不依赖于优秀的rosrust crate)。
  • 可以不使用Rust标准库或分配器进行编译,以支持嵌入式应用程序。
  • RosOpenCvIntrinsics类型实现了来自cam-geomIntrinsicParameters特质。因此,可以使用RosOpenCvIntrinsics创建一个cam_geom::Camera来处理内在参数,使用ExtrinsicParameters结构体(来自cam-geom)处理相机姿态。(见下面的示例。)
  • 当编译带有 serde-serialize 功能时,使用 from_ros_yaml~/.ros/camera_info/camera_name.yaml 中读取 ROS camera_calibration/cameracalibrator.py 节点保存的相机标定。
  • 当编译带有 serde-serialize 功能时,使用 serde 读取和写入 RosOpenCvIntrinsics 结构。

示例 - 从 ROS YAML 文件中读取并创建 cam_geom::Camera

假设我们有一个由 ROS camera_calibration/cameracalibrator.py 节点保存的 YAML 文件。我们如何从中创建一个 cam_geom::Camera 呢?

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 yaml_buf = b"image_width: 659
image_height: 494
camera_name: Basler_21029382
camera_matrix:
  rows: 3
  cols: 3
  data: [516.385667640757, 0, 339.167079537312, 0, 516.125799367807, 227.37993524141, 0, 0, 1]
distortion_model: plumb_bob
distortion_coefficients:
  rows: 1
  cols: 5
  data: [-0.331416226762003, 0.143584747015566, 0.00314558656668844, -0.00393597842852019, 0]
rectification_matrix:
  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::new_normalize(Vector3::new(0.0, 0.0, 1.0));
let pose = cam_geom::ExtrinsicParameters::from_view(&camcenter, &lookat, &up);

// We need the `serde-serialize` feature for the `from_ros_yaml` function.
#[cfg(feature = "serde-serialize")]
{
    let from_ros = opencv_ros_camera::from_ros_yaml(&yaml_buf[..]).unwrap();

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

测试

使用以下方式测试 no_std 编译:

# install target with: "rustup target add thumbv7em-none-eabihf"
cargo check --no-default-features --target thumbv7em-none-eabihf

使用以下方式运行单元测试:

cargo test
cargo test --features serde-serialize

serde 支持需要 std。

重新渲染 README.md

cargo install cargo-readme
cargo readme > README.md

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

行为准则

任何与该软件在任何空间互动的人,包括但不限于这个 GitHub 仓库,都必须遵守我们的 行为准则

许可证

许可以下任一项

依赖关系

~4.5MB
~91K SLoC