#camera #unsafe-bindings #computer-vision #libcamera

sys libcamera-sys

对libcamera的低级不安全绑定

4个版本

0.2.3 2023年11月8日
0.2.2 2023年8月3日
0.2.1 2023年2月18日
0.2.0 2023年2月18日

120多媒体 类别中

Download history 51/week @ 2024-03-11 20/week @ 2024-03-18 23/week @ 2024-03-25 31/week @ 2024-04-01 7/week @ 2024-04-08 24/week @ 2024-04-15 9/week @ 2024-04-22 10/week @ 2024-04-29 8/week @ 2024-05-06 23/week @ 2024-05-13 38/week @ 2024-05-20 22/week @ 2024-05-27 18/week @ 2024-06-03 8/week @ 2024-06-10 14/week @ 2024-06-17 24/week @ 2024-06-24

每月下载 65
2 个包中使用(通过 libcamera

MIT/Apache

29KB
477

libcamera-rs

Rust Latest version Documentation License

libcamera 提供实验性的Rust绑定。

项目结构

  • libcamera-sys - 对libcamera的低级不安全绑定。同时包含libcamera C API封装,以便更容易地与C++代码交互。
  • libcamera-meta - 从libcamera控件、属性和格式YAML生成C和Rust代码的脚本。主要用于 regenerate.sh 脚本。
  • libcamera - 基于 libcamera-sys 的安全libcamera Rust接口。

未发布的 main 文档:[在此处](https://lit-robotics.github.io/libcamera-rs/libcamera/index.html)

构建

libcamera-sys 需要 libcamera 已安装并且可通过pkg-config访问。请查阅官方 入门指南 了解如何构建libcamera。请注意,我们还没有与libcamera绑定的发布计划,因此可能会有破坏性变更。这也意味着任何二进制发行版(例如在Ubuntu 22.04中)可能会太旧。已知此crate可以与libcamera v0.1.0 构建。

不需要其他特殊依赖。所有crate都可以使用根工作空间目录通过 cargo build 构建。

运行示例

使用仅 libcamera 打印 libcamera 版本(代码:[在此处](https://github.com/lit-robotics/libcamera-rs/blob/7c3a0dd52f1d54292dad64749f5acf35b603cfb3/libcamera-sys/libcamera-sys/examples/version.rs))

osboxes@osboxes:~/libcamera-rs$ cargo run --example version
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/examples/version`
libcamera: v0.0.1+50-aa7b3740

列出摄像头(代码:[在此处](https://github.com/lit-robotics/libcamera-rs/blob/7c3a0dd52f1d54292dad64749f5acf35b603cfb3/libcamera-sys/libcamera-sys/examples/list_cameras.rs))

osboxes@osboxes:~/libcamera-rs$ cargo run --example list_cameras
    Finished dev [unoptimized + debuginfo] target(s) in 0.03s
     Running `target/debug/examples/list_cameras`
[4:16:17.777208430] [25773]  INFO Camera camera_manager.cpp:293 libcamera v0.0.1+50-aa7b3740
Camera 0
ID: \_SB_.PCI0-2:1.0-0c45:2690
Properties: Immutable(
    {
        PixelArrayActiveAreas: PixelArrayActiveAreas(
            [
                Rectangle {
                    x: 0,
                    y: 0,
                    width: 1920,
                    height: 1080,
                },
            ],
        ),
        PixelArraySize: PixelArraySize(
            Size {
                width: 1920,
                height: 1080,
            },
        ),
        Location: CameraExternal,
        Model: Model(
            "AUKEY PCW1: AUKEY PCW1",
        ),
    },
)
Available formats: {
    MJPEG: [
        Size {
            width: 320,
            height: 240,
        },
...
        Size {
            width: 1920,
            height: 1080,
        },
    ],
    YUYV: [
        Size {
            width: 320,
            height: 240,
        },
...
        Size {
            width: 1920,
            height: 1080,
        },
    ],
}

将JPEG图像捕获到文件中(代码

osboxes@osboxes:~/libcamera-rs$ cargo run --example jpeg_capture target/image.jpg
    Finished dev [unoptimized + debuginfo] target(s) in 0.04s
     Running `target/debug/examples/jpeg_capture target/image.jpg`
[4:18:00.104950400] [25950]  INFO Camera camera_manager.cpp:293 libcamera v0.0.1+50-aa7b3740
Using camera: AUKEY PCW1: AUKEY PCW1
Generated config: [
    StreamConfigurationRef {
        pixel_format: MJPEG,
        size: Size {
            width: 1920,
            height: 1080,
        },
        stride: 0,
        frame_size: 4147789,
        buffer_count: 4,
    },
]
[4:18:00.159095868] [25950]  INFO Camera camera.cpp:1026 configuring streams: (0) 1920x1080-MJPEG
Allocated 4 buffers
Waiting for camera request execution
Camera request Request { seq: 0, status: Complete, cookie: 0 } completed!
Metadata: Immutable(
    {
        SensorTimestamp: SensorTimestamp(
            15480581860000,
        ),
    },
)
FrameBuffer metadata: Immutable(
    FrameMetadataRef {
        status: Success,
        sequence: 0,
        timestamp: 15480581860000,
        planes: [
            libcamera_frame_metadata_plane {
                bytes_used: 442672,
            },
        ],
    },
)
Written 4147789 bytes to target/image.jpg

安全注意事项

libcamera-rs旨在成为一个完全内存安全的包装器,然而,由于libcamera的复杂性和对象之间的众多交叉引用,确保完全的安全性相当困难,因此很可能存在错误。欢迎提交问题和拉取请求。

常见问题解答

  • 为什么不用直接包装C++ API,而不是使用中间的C层?
    • 在Rust中编写C++包装器相当困难,因为许多功能无法很好地转换为Rust:多态性、函数重载、模板等。有生成C++绑定的工具,但它们通常在更复杂的情况下会失败,或者导致比额外的C层更多的样板代码。
  • 类似于列表的结构(CameraConfigurationControlList)不可索引
    • 无法为这些结构实现IndexIndexMut特性,因为这些特性只能返回结构内部现有数据的引用。大多数libcamera包装器返回新类型变体,这使得它们与索引不兼容。

许可协议

根据您的选择,许可协议如下:

无运行时依赖

~0–2MB
~39K SLoC