2 个不稳定版本
0.2.0 | 2023年10月28日 |
---|---|
0.1.0 | 2021年6月28日 |
#2076 in 硬件支持
被 eye 使用
69KB
1.5K SLoC
eye-hal
eye-hal
旨在为 Rust 中的类似相机设备提供硬件抽象层 (HAL)。这包括常见的消费级 RGB/YUV 网络摄像头以及更复杂的(红外、单色)硬件。所有输出缓冲区类型都应该得到支持,包括多平面缓冲区。
除了缓冲区捕获之外,eye-hal
还提供硬件控制的抽象。一个示例用例是白平衡或焦点控制。
设计
所有平台(即后端)特定代码都放在 src/platform 中。其余应该是平台无关的代码。平台实现之间共享的特质放在 src/traits.rs 中。
在 HAL 实现中,有三个主要实体
Context
一个平台特定上下文,用于查询设备和通用系统信息。它还用于通过获取句柄来实际打开设备。Device
这表示传感器硬件本身。它可以用来操作硬件控制,如焦点、白平衡或增益级别。然而,主要功能在于start_stream()
函数,在那里你可以创建用于捕获缓冲区的输入流。Stream
一个流是一个实体,它提供了访问由相机传感器捕获的缓冲区的权限。在任何时候只有一个缓冲区可用 - 这是当前代码中的设计决策。尽可能实现流作为零拷贝机制(只返回缓冲区数据的视图给调用者)。
用法
以下您可以找到这个 crate 的快速使用示例。它介绍了捕获帧所必需的基本知识。
use eye_hal::PlatformContext;
use eye_hal::traits::{Context, Device, Stream};
fn main() -> Result<()> {
// Create a context
let ctx = PlatformContext::default();
// Query for available devices.
let devices = ctx.devices()?;
// First, we need a capture device to read images from. For this example, let's just choose
// whatever device is first in the list.
let dev = ctx.open_device(&devices[0])?;
// Query for available streams and just choose the first one.
let streams = dev.streams()?;
let stream_desc = streams[0].clone();
println!("Stream: {:?}", stream_desc);
// Since we want to capture images, we need to access the native image stream of the device.
// The backend will internally select a suitable implementation for the platform stream. On
// Linux for example, most devices support memory-mapped buffers.
let mut stream = dev.start_stream(&stream_desc)?;
// Here we create a loop and just capture images as long as the device produces them. Normally,
// this loop will run forever unless we unplug the camera or exit the program.
loop {
let frame = stream
.next()
.expect("Stream is dead")
.expect("Failed to capture frame");
}
}
查看提供的 examples
获取更多示例应用程序。
依赖项
~0–3MB
~49K SLoC