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 在 多媒体 类别中
每月下载 65 次
在 2 个包中使用(通过 libcamera)
29KB
477 行
libcamera-rs
为 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层更多的样板代码。
- 类似于列表的结构(
CameraConfiguration
,ControlList
)不可索引- 无法为这些结构实现
Index
和IndexMut
特性,因为这些特性只能返回结构内部现有数据的引用。大多数libcamera包装器返回新类型变体,这使得它们与索引不兼容。
- 无法为这些结构实现
许可协议
根据您的选择,许可协议如下:
- Apache License,版本2.0(LICENSE-APACHE或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可协议(LICENSE-MIT或https://opensource.org/licenses/MIT)
。
无运行时依赖
~0–2MB
~39K SLoC