2 个不稳定版本

0.2.0 2023年10月28日
0.1.0 2021年6月28日

#2076 in 硬件支持


eye 使用

MIT 许可证

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