首页
商城
  • English
  • 简体中文
首页
商城
  • English
  • 简体中文
  • 产品系列

    • FPGA+ARM

      • GM-3568JHF

        • 一、简介

          • GM-3568JHF 简介
        • 二、快速开始

          • 00 前言
          • 01 环境搭建
          • 02 编译说明
          • 03 烧录指南
          • 04 调试工具
          • 05 软件更新
          • 06 查看信息
          • 07 测试命令
          • 08 应用编译
          • 09 源码获取
        • 三、外设与接口

          • 01 USB
          • 02 显示与触摸
          • 03 以太网
          • 04 WIFI
          • 05 蓝牙
          • 06 TF-Card
          • 07 音频
          • 08 串口
          • 09 CAN
          • 10 RTC
        • 四、应用开发

          • 01 UART读写案例
          • 02 按键检测案例
          • 03 LED灯闪烁案例
          • 04 MIPI屏幕检测案例
          • 05 读取 USB 设备信息案例
          • 06 FAN 检测案例
          • 07 FPGA FSPI 通信案例
          • 08 FPGA DMA 读写案例
          • 09 GPS调试案例
          • 10 以太网测试案例
          • 11 RS485读写案例
          • 12 FPGA IIC 读写案例
          • 13 PN532 NFC读卡案例
          • 14 TF卡读写案例
        • 五、QT开发

          • 01 ARM64交叉编译器环境搭建
          • 02 QT 程序加入开机自启服务
        • 六、RKNN_NPU开发

          • 01 RK3568 NPU 概述
          • 02 开发环境搭建
          • 运行官方 YOLOv5 示例
        • 七、FPGA开发

          • ARM与FPGA通讯
          • FPGA开发手册
        • 八、其他

          • 01 根目录文件系统的修改
          • 02 系统自启服务
        • 九、资料下载

          • 资料下载
    • ShimetaPi

      • M4-R1

        • 一、简介

          • M4-R1简介
        • 二、快速上手

          • 01 OpenHarmony概述
          • 02 镜像烧录
          • 03 应用开发快速上手
          • 04 设备开发快速上手
        • 三、应用开发

          • 01 ArkUI

            • 1 ArkTS语言简介
            • 2 UI 组件-Row 容器介绍
            • 3 UI 组件-Column 容器介绍
            • 4 UI 组件-Text 组件
            • 5 UI 组件-Toggle 组件
            • 6 UI 组件-Slider 组件
            • 7 UI 组件-Animation 组件&Transition 组件
          • 02 资料获取

            • 1 OpenHarmony 官方资料
          • 03 开发须知

            • 1 Full-SDK替换教程
            • 2 引入和使用三方库
            • 3 HDC调试
            • 4 命令行恢复出厂模式
            • 5 升级App为system权限
          • 04 构建第一个应用

            • 1 构建第一个ArkTs应用-HelloWorld
          • 05 案例

            • 01 串口调试助手应用案例
            • 02 手写板应用案例
            • 03 数字时钟应用案例
            • 04 WIFI 信息获取应用案例
        • 四、设备开发

          • 1 Ubuntu环境开发

            • 01 环境搭建
            • 02 下载源码
            • 03 编译源码
          • 2 使用DevEco Device Tool 工具

            • 01 工具简介
            • 02 开发环境的搭建
            • 03 导入SDK
            • 04 HUAWEI DevEco Tool 功能介绍
        • 五、内核外设与接口

          • 01 指南
          • 02 设备树介绍
          • 03 NAPI 入门
          • 04 ArkTS入门
          • 05 NAPI开发实战演示
          • 06 GPIO介绍
          • 07 I2C通讯
          • 08 SPI通信
          • 09 PWM 控制
          • 10 串口通讯
          • 11 TF卡
          • 12 屏幕
          • 13 触摸
          • 14 Ethernet(以太网)
          • 15 M.2 硬盘
          • 16 音频
          • 17 WIFI & BT
          • 18 摄像头
        • 六、资料下载

          • 资料下载
      • M5-R1

        • 一、简介

          • M5-R1 开发文档
        • 二、快速上手

          • 镜像烧录
          • 环境搭建
          • 下载源码
        • 三、外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
        • 四、资料下载

          • 资料下载
      • Pico-G1

        • 一、产品概述

          • 01 产品介绍
          • 02 SDK版本基本信息
        • 二、快速入门

          • 01 开发环境搭建
          • 02 镜像编译
          • 03 镜像烧录
          • 04 系统登录
          • 05 网络配置
          • 06 文件传输
          • 07 SDK目录结构
          • 08 部署第一个应用程序
          • 09 部署第一个驱动程序
          • 10 SD卡挂载
        • 三、外设与接口

          • 01 GPIO控制
          • 02 UART串口通信
          • 03 I2C 通信
          • 04 SPI 通信
        • 四、MPP媒体开发

          • 01 MPP媒体处理软件
          • 02 图像处理链路
          • 03 视频输入
          • 04 图像编码
        • 五、NPU与AI

          • 01 NPU驱动与运行库架构
          • 02 .xmm 模型加载
          • 03 SVP视频处理
          • 04 AI降噪 (AI_NR)
        • 六、应用程序示例

          • 01 加解密接口应用
          • 02 ADC 采集应用
          • 03 低功耗应用
          • 04 音频处理应用
          • 05 视频编码应用
          • 06 视频输入应用
          • 07 视频图形子系统应用
          • 08 区域叠加应用
          • 09 智能视频引擎应用
          • 10 UVC 网络摄像头应用
          • 11 综合快速演示应用
          • 12 FPN 校正应用
          • 13 区域运动检测应用
          • 14 MTCNN 人脸检测应用
        • 七、扩展板外设功能例程

          • 00 - Pico 扩展板外设功能例程总览
          • 01 - OLED 显示应用
          • 02 - TFT 显示应用
          • 03 - MPU6050 陀螺仪应用
          • 04 - ADC 采集应用
          • 05 - 无源蜂鸣器应用
          • 06 - MQ 气体传感器应用
          • 07 - GPS 定位应用
          • 08 - SHT20 温湿度应用
          • 09 - 超声波测距应用
          • 10 - SPO2 血氧传感器应用
          • 11 - 电机控制应用
          • 12 - 舵机控制应用
    • 开源鸿蒙

      • SC-3568HA

        • 一、简介

          • SC-3568HA简介
        • 二、快速上手

          • OpenHarmony概述
          • 镜像烧录
          • 开发环境准备
          • Hello World应用以及部署
        • 三、应用开发

          • ArkUI

            • 第一章 ArkTS语言简介
            • 第二章 UI组件介绍和实际应用(上)
            • 第三章 UI组件介绍和实际应用(中)
            • 第四章 UI组件介绍和实际应用(下)
          • 拓展

            • 第一章 入门指引
            • 第二章 三方库的引用和使用
            • 第三章 应用编译以及部署
            • 第四章 命令行恢复出厂设置
            • 第五章 系统调试--HDC调试
            • 第六章 APP 稳定性测试
            • 第七章 应用测试
        • 四、设备开发

          • 第一章 环境搭建
          • 第二章 下载源码
          • 第三章 编译源码
        • 五、内核的外设与接口

          • 树莓派接口
          • GPIO 接口
          • I2C 接口
          • SPI通信
          • PWM控制
          • 串口通讯
          • TF Card
          • 屏幕
          • 触摸
          • 音频
          • RTC
          • Ethernet
          • M.2
          • MINI-PCIE
          • Camera
          • WIFI&BT
          • 树莓派拓展板
        • 六、资料下载

          • 资料下载
      • M-K1HSE

        • 一、简介

          • M-K1HSE 简介
        • 二、快速开始

          • 开发环境搭建
          • 源码获取
          • 编译说明
          • 烧录指南
        • 三、应用开发

          • 00 应用开发环境搭建
          • 01 第一个应用-Hello World
        • 四、外设与接口

          • 01 Audio
          • 02 RS485
          • 03 Display
        • 五、系统定制开发

          • 系统移植
          • 系统定制
          • 驱动开发
          • 系统调试
          • OTA升级
        • 六、资料下载

          • 资料下载
    • HVS视觉融合相机

      • 快速开始

        • 01 SDK 介绍
        • 02 资料下载
        • 03 设备固件烧录
        • 04 第一个 C++ 程序
        • 05 第一个 Python 程序
        • 06 Python 数据分析
        • 07 MultiVision Studio
      • 二次开发

        • 01 编程指引

          • 01 打开相机
          • 02 读取事件
          • 03 录制与回放
          • 04 事件处理(去噪)
          • 05 显示与可视化
          • 06 调参
          • 07 采集 APS 图像
        • 02 Toolkit SDK

          • 01 Hybrid Vision Toolkit
          • 02 快速上手
          • 03 C++ API
          • 04 Python API
        • 03 Algo SDK

          • 01 Hybrid Vision Algo
          • 02 Algo API
          • 03 Windows Algo SDK
        • 04 示例程序总览
        • 05 应用场景
      • 基础知识

        • 01 事件相机基础原理
        • 02 HVS 融合视觉
        • 03 事件可视化
        • 04 数据格式参考
        • 05 术语表
        • 06 偏置与调参
        • 07 视频教程
      • HVS 相机

        • 01 HVS 相机快速上手
        • 02 网络化能力

          • 01 HVS 相机系统架构
          • 2 EVS Network Server
          • 3 EVS Time Sync
          • 4 Web Window
        • 03 HVS 相机兼容性矩阵
        • 04 常见问题解决指南
        • 05 产品

          • CF-NRS1(灵光一号视觉融合相机)
      • HVS 模块

        • 01 MIPI 模块快速上手
        • 02 载板适配

          • RDK X5 载板适配
          • RDK S100 载板适配
          • 树莓派载板适配
          • 地瓜派载板适配
          • shimetapi 板载板适配
        • 03 MIPI 模块兼容性矩阵
        • 04 产品

          • EVS_003 传感器模块
    • AI硬件

      • 1684XB-32T

        • 一、简介

          • AIBOX-1684XB-32简介
        • 二、快速上手

          • 初次使用
          • 网络配置
          • 磁盘使用
          • 内存分配
          • 风扇策略
          • 固件升级
          • 交叉编译
          • 模型量化
        • 三、应用开发

          • 开发简介

            • Sophgo SDK开发
            • SOPHON-DEMO简介
          • 大语言模型

            • 部署Llama3示例
            • Sophon LLM_api_server开发
            • 部署MiniCPM-V-2_6
            • Qwen-2-5-VL图片视频识别DEMO
            • Qwen3-chat-DEMO
            • Qwen3-Qwen Agent-MCP开发
            • Qwen3-langchain-AI Agent
          • 深度学习

            • ResNet(图像分类)
            • LPRNet(车牌识别)
            • SAM(通用图像分割基础模型)
            • YOLOv5(目标检测)
            • OpenPose(人体关键点检测)
            • PP-OCR(光学字符识别)
        • 四、资料下载

          • 资料下载
      • 1684X-416T

        • 简介

          • AIBOX-1684X-416简介
        • Demo简单操作指引

          • shimeta智慧监控demo的简单使用说明
      • RDK-X5

        • 简介

          • RDK-X5 硬件简介
        • 快速开始

          • RDK-X5 快速开始
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-颜色识别检测
            • 实验03-手势识别体验
            • 实验04-YOLOv5物体检测
      • RDK-S100

        • 简介

          • RDK-S100 硬件简介
        • 快速开始

          • RDK-S100 硬件简介
        • 应用开发

          • AI在线模型开发

            • 实验01-接入火山引擎豆包 AI
            • 实验02-图片分析
            • 实验03-多模态视觉分析定位
            • 实验04-多模态图文比较分析
            • 实验05-多模态文档表格分析
            • 实验06-摄像头运用-AI视觉分析
          • 大语言模型

            • 实验01-语音识别
            • 实验02-语音对话
            • 实验03-多模态图片分析-语音对话
            • 实验04-多模态图片比较-语音对话
            • 实验05-多模态文档分析-语音对话
            • 实验06-多模态视觉运用-语音对话
          • ROS2基础开发

            • 实验01-搭建环境
            • 实验02-工作包的创建及编译
            • 实验03-运行 ROS2 话题通信节点
            • 实验04-ROS2 相机应用
          • 40pin-IO开发

            • 实验01-GPIO 输出(LED闪烁)
            • 实验02-GPIO 输入
            • 实验03-按键控制 LED
            • 实验04-PWM 输出
            • 实验05-串口输出
            • 实验06-IIC 实验
            • 实验07-SPI 实验
          • USB模块开发使用

            • 实验01-USB 语音模块使用
            • 实验02-声源定位模块使用
          • 机器视觉技术实战

            • 实验01-打开 USB 摄像头
            • 实验02-图像处理基础
            • 实验03-目标检测
            • 实验04-图像分割
      • RK1828

        • 一、简介

          • M5-182X-A1 AI 边缘盒子 - 产品介绍
          • M5-182X-A1 硬件规格
          • M5-182X-A1 使用与安全
        • 二、快速开始

          • M5-182X-A1 镜像烧录
          • RK182X 硬件安装与验证
          • RK182X 开发环境快速搭建
          • RK182X SDK 总览
          • RK182X 环境搭建详解
          • RK182X 快速开始
          • 原厂 SDK 资料抽取记录
        • 三、开发指南

          • ClawChips 架构与原理
          • SKILL 使用手册
          • RK182X系列LLM推理(RK1828型号)
          • RK182X系列CNN推理(RK1828型号)
          • 模型转换
          • RK182X AI Agent 应用开发指南
          • RK182X 工业异常检测应用
        • 四、SDK 参考

          • RKNN3-SDK 概述

            • RKNN3 SDK 概述
          • RKNN3-Toolkit

            • RKNN3 Toolkit 安装与使用
          • RKLLM

            • RKLLM 设备端 LLM 推理
          • RK182X系列 NPU 概述与架构(RK1828型号)
          • RK182X INT8 量化推理部署
          • RK182X MPP 多媒体处理框架
          • MPP 详解

            • RK182X 视频解码
            • RK182X 视频编码
          • NPU 详解

            • RKNN 模型转换
            • RK182X NPU INT8 量化推理
            • RK182X 多模型并行推理
          • RGA 详解

            • RK182X RGA 2D 图形加速
          • VPU 详解

            • RK182X VPU 编解码
        • 五、硬件参考

          • RK182X系列 硬件架构概述(RK1828型号)
          • RK182X 引脚定义与复用配置
          • RK182X 引脚定义
          • RK182X 电源管理
          • RK182X 时钟与 PLL 配置
          • RK182X 时钟与频率配置
        • 六、实战教程

          • Hello World
          • Hello RK1828 - 第一个程序
          • RTSP 推流
          • RTSP 推流 + AI 分析
          • 视美泰AI龙虾一键部署
          • PaddleOCR-VL 文字识别
          • Qwen3-1.7B LLM 文本对话
          • AI 巡检多视角(Qwen3-VL 包装)
          • YOLOv5 目标检测
        • 七、资料下载

          • 资料下载
        • 八、常见问题

          • 常见问题
    • 核心板

      • C-3568BQ

        • 简介

          • C-3568BQ 简介
      • C-3588LQ

        • 简介

          • C-3588LQ 简介
      • GC-3568JBAF

        • 简介

          • GC-3568JBAF 简介
      • C-K1BA

        • 简介

          • C-K1BA 简介
    • 软件平台

      • ShiMetaPi Workbench

        • 一、产品简介

          • 产品概述
          • 核心架构
          • 功能入口
          • 支持的硬件
          • 版本说明
        • 二、快速入门

          • 安装与登录
          • 连接设备
          • 配置环境
          • 接入 AIHub
          • 首次调用模型
        • 三、用户指南

          • 工作区总览
          • 设备管理
          • 模型广场
          • 一键部署
          • 视觉 - SVP
          • 视觉 - 自定义模型
          • shimeta-py IDE
          • 终端
          • Agent 调试助手
          • 设置与资源
        • 四、常见问题

          • 安装与登录
          • 设备连接
          • 模型与部署
          • 视觉与运行时
          • 设置与其他
      • ShimetaPi软件源

        • 简介

          • ShimetaPi 软件源
        • Pico G1 (GK7206)

          • 快速开始

            • 安装与首次推理
            • shimeta_infer — 图片推理
            • shimeta_camera — 摄像头实时推理
            • SVP 场景检测
            • 文件传输与内置模型参考
            • 常见问题
          • HTTP API & Python SDK

            • HTTP API 参考
      • 模型微调训练平台

        • 一、平台介绍

          • 模型训练平台
        • 二、快速上手

          • 注册与登录
          • 创建第一个模型(30 分钟快速体验)
        • 三、训练指南

          • 数据准备与标注
          • 训练参数配置
          • 启动与监控训练
          • 模型评估与测试
        • 四、模型部署

          • 导出模型
          • 部署到边缘设备

Hybrid Vision Toolkit C++ API

v2.0 三后端(USB / MIPI / Ethernet)共用同一套 Shimeta::hv::Camera 统一 API。本页给出完整 C++ 公有 API 参考;MIPI 专属的差异(RAW8 解码、APS 格式因板卡而异、ARM 构建)在各对应小节内标注。

符号、签名以 include/shimetapi/ 头文件为准(源码仓与发布仓一致,零差异)。所有符号位于 Shimeta:: 命名空间下,零第三方事件 SDK 依赖。

core

头文件:<shimetapi/core/*.h>

API主要用途具体函数 / 成员
EventCD表示单个事件的基础 POD 数据类型。x / y / t / polarity
Status / statusToString表示统一错误码,并转换为用于日志和诊断的可读文本。statusToString()
BufferView / BufferPool管理零拷贝帧数据的只读视图与固定大小内存池。BufferPool() / acquire() / slab_size() / available()
PixelFormat标记 APS 图像的像素格式。BayerRG8 / RGB888 / Gray8 / RAW8 / NV12
TimestampInfo保存 EVS、APS 与 PTP 的时间戳信息。evs_ts_ns / aps_ts_ns / ptp_locked
EvsTimestamp保存从 MIPI RAW8 子帧提取的 EVS 传感器时间戳。raw_timestamp / processed_timestamp / valid
Frame承载统一的 EVS、APS、格式和生命周期信息。aps / evs / ts / format / aps_owner / evs_owner

Shimeta::EventCD

#include <shimetapi/core/event_cd.h>

作用:自有事件类型(POD),字段语义与业界常见事件结构一一对应。

struct EventCD {
    uint16_t x;        // 像素 X 坐标
    uint16_t y;        // 像素 Y 坐标
    int64_t  t;        // 时间戳(微秒)
    bool     polarity; // 1 = CD_ON, 0 = CD_OFF
};

Shimeta::Status

#include <shimetapi/core/status.h>

作用:库统一错误码枚举;statusToString() 把错误码转为人读字符串,便于日志与诊断。

enum class Status : int32_t {
    Ok = 0, ErrDeviceNotFound = -1, ErrPermissionDenied = -2,
    ErrUsbTransfer = -3, ErrV4l2Ioctl = -4, ErrNetworkTimeout = -5,
    ErrInvalidParam = -6, ErrBufferFull = -7, ErrDecodeFailure = -8,
    ErrUnsupportedFormat = -9,
};
const char* statusToString(Status s);

Shimeta::BufferView / BufferPool

#include <shimetapi/core/buffer_pool.h>

作用:BufferView 是对池 slab 的非拥有只读视图;BufferPool 是固定大小 slab 池,用于零拷贝帧生命周期管理。

struct BufferView {
    const uint8_t* data = nullptr;
    size_t         size = 0;
};
class BufferPool {
public:
    BufferPool(size_t slab_size, size_t slab_count);
    std::shared_ptr<uint8_t[]> acquire();
    size_t slab_size() const;
    size_t capacity() const;
    size_t available() const;
};

BufferPool 构造函数

【语法】BufferPool(size_t slab_size, size_t slab_count);

【描述】构造池并预分配 slab_count 个 slab,每个 slab_size 字节。

【参数】

参数类型描述
slab_sizesize_t (in)单个 slab 的字节数(如 NV12 帧 = w×h×3/2)
slab_countsize_t (in)slab 总数(决定并发帧数上限)

【返回值】无(构造函数)。

【注意】slab 耗尽时 acquire() 返回 nullptr,slab_count 应 ≥ 并发帧数。

【举例】

Shimeta::BufferPool pool(768 * 608 * 3 / 2, 8);  // NV12 帧 × 8

acquire

【语法】std::shared_ptr<uint8_t[]> acquire();

【描述】从池中获取一个 slab,返回引用计数 handle。最后一个引用释放时 slab 自动归还池。

【参数】无。

【返回值】

返回值描述
非空 shared_ptr<uint8_t[]>成功获取 slab
nullptr池已耗尽(所有 slab 均在使用中)

【注意】返回的 shared_ptr 可安全传递给 Frame.*_owner,保证视图在 Frame 存活期间有效。

【举例】

auto slab = pool.acquire();
if (!slab) { /* 池耗尽,丢帧或等待 */ }

slab_size / capacity / available

【语法】

size_t slab_size() const;    // 单 slab 字节数
size_t capacity() const;     // slab 总数
size_t available() const;    // 当前空闲 slab 数

【描述】查询池的容量与空闲状态。

【参数】无。

【返回值】size_t(对应值)。

【注意】available() 可用于监控池压力;趋近 0 表示丢帧风险。

【举例】无。

Shimeta::PixelFormat

#include <shimetapi/core/pixel_format.h>

作用:APS 图像像素格式枚举。

enum class PixelFormat : uint8_t { BayerRG8 = 0, RGB888 = 1, Gray8 = 2, RAW8 = 3, RAW10 = 4, NV12 = 5 };

NV12 为 MIPI HVS 后端 APS 帧经 ISP→PYM 后的 packed YUV 格式;USB 后端 APS 默认 NV12(768×608)。X5 载板上 APS 走 VIN 直读,输出 Gray8(预期行为,见 MIPI 注意事项)。

Shimeta::TimestampInfo

#include <shimetapi/core/timestamp.h>

作用:帧时间戳信息。

struct TimestampInfo {
    int64_t evs_ts_ns  = 0;  // EVS 事件参考时间戳(纳秒)
    int64_t aps_ts_ns  = 0;  // APS 曝光时刻(纳秒)
    bool    ptp_locked = false; // Ethernet 后端 PTP 是否锁定
};

Shimeta::EvsTimestamp

#include <shimetapi/core/evs_timestamp.h>

作用:EVS 传感器内部时间戳(从 MIPI RAW8 子帧头提取),用于 HybridWriter / HybridReader 的 tsmp chunk。由 Shimeta::codec::extractEvsTimestamp() 提取。

struct EvsTimestamp {
    uint64_t raw_timestamp = 0;         // 传感器 45-bit 原始时间戳
    uint64_t processed_timestamp = 0;   // raw_timestamp / 200(微秒)
    bool     valid = false;
};

Shimeta::Frame

#include <shimetapi/core/frame.h>

作用:统一帧。aps / evs 为池内存的只读视图,*_owner 持有 slab 引用以保证视图在 Frame 存活期间有效(零拷贝、池托管生命周期)。

struct Frame {
    BufferView    aps{};
    BufferView    evs{};
    TimestampInfo ts{};
    int           width{0};
    int           height{0};
    int           frame_id{0};
    PixelFormat   format{};
    std::shared_ptr<uint8_t[]> aps_owner{};
    std::shared_ptr<uint8_t[]> evs_owner{};
};

Frame.evs 是 HAL 未解码的原始事件字节(USB 后端通常为 EVT2);需用对应 codec 解码。

hv

头文件:<shimetapi/hv/camera.h>、<shimetapi/hv/device_config.h>、<shimetapi/hv/event_format.h>、<shimetapi/hv/event_packet.h>、<shimetapi/hv/image_data.h>。

API主要用途具体函数 / 成员
Backend / EventFormat选择采集后端与事件字节编码格式。Auto / Usb / Mipi / MipiHvs / Ethernet / Evt2 / Evt3
DeviceConfig集中配置 USB、MIPI 与 Ethernet 采集参数。backend / device_node / ip / event_fmt / evs_fps
Camera统一管理相机初始化、采集、回调、曝光、帧率和资源释放。Init() / StartStream() / GetFrame() / Set*Callback() / StopStream()
EventPacket / ImageData向事件和图像回调传递原始数据及元信息。data / t_begin_ns / t_end_ns / pixels / format / ts

Shimeta::hv::Backend / EventFormat

#include <shimetapi/hv/device_config.h>#include <shimetapi/hv/event_format.h>

作用:Backend 选择采集后端;EventFormat 选择事件字节编码格式(决定 Frame.evs 如何解码)。

enum class Backend    { Auto, Usb, Mipi, MipiHvs, Ethernet };
enum class EventFormat { Evt2, Evt3 };
Backend说明
Auto自动选择(按 DeviceConfig 字段推断)。
Usblibusb 后端(USB 相机)。
MipiMIPI 后端(EVS-only)。
MipiHvsMIPI HVS 双 VC 后端:VC0 传 EVS 事件,VC1 传 APS 帧。
Ethernet以太网后端(POSIX sockets,DVS1 协议)。

Shimeta::hv::DeviceConfig

#include <shimetapi/hv/device_config.h>

作用:采集配置 —— 选择后端 + 各后端参数。传给 Camera::Init()。

struct DeviceConfig {
    Backend     backend      = Backend::Auto;
    std::string device_node;                 // MIPI: "/dev/video0"
    std::string ip;                          // Ethernet
    uint16_t    data_port    = 8000;
    uint16_t    ctrl_port    = 8001;
    EventFormat event_fmt    = EventFormat::Evt3;
    int         buffer_count = 8;
    uint16_t    vendor_id = 0, product_id = 0;   // USB VID/PID
    enum class QueuePolicy { DropOldest, Block };
    QueuePolicy queue_policy = QueuePolicy::DropOldest;
    int         event_urbs   = 4;             // USB 事件端点在途 URB 数
    uint16_t    evs_fps      = 0;             // 0=不设置;非 0=Init 时自动下发
    int         sensor_index = 0;             // MIPI 传感器索引;平台样例通常由构建配置覆盖
    uint8_t     i2c_bus      = 1;             // MIPI 安全芯片认证 I2C 总线
    uint16_t    listen_port = 8888;           // Ethernet: TCP 监听端口
    std::string bind_ip;                      // Ethernet: 本地绑定 IP(空=INADDR_ANY)
};
字段适用后端描述
backend全部选择后端类型
vendor_id / product_idUSBUSB 设备 VID/PID(如 0x1d6b / 0x0105)
event_urbsUSB事件端点在途 URB 数,默认 4;增大可提高吞吐但占内存
queue_policy全部池满策略:DropOldest(丢旧帧,默认)/ Block(阻塞等待)
event_fmt全部事件字节格式:Evt2(USB 默认)/ Evt3
evs_fps全部MIPI 帧率档;USB/Ethernet 运行时改帧率用 Camera::SetFrameRate¹
device_nodeMIPI设备节点路径,如 "/dev/video0"
sensor_indexMIPIRDK 传感器索引;API 默认 0,S100/X5 样例当前分别使用 9/49
i2c_busMIPI安全芯片认证 I2C 总线号,默认 1
ip / data_port / ctrl_portEthernet相机 IP + 数据/控制端口
listen_port / bind_ipEthernet相机作服务端时的监听端口与本地绑定 IP

¹ MIPI:0 = 默认 240;可选 120 / 240 / 300 / 500 / 750 / 1000;Init 时下发,非档位值报错。

Shimeta::hv::Camera

#include <shimetapi/hv/camera.h>

作用:统一采集 API;同一套接口覆盖 USB / MIPI / Ethernet 三后端。支持同步拉取(GetFrame)与异步回调(Frame / Event / Image 三选一或多)。

namespace Shimeta::hv {
class Camera {
public:
    Camera();
    ~Camera();
    Camera(const Camera&) = delete;
    Camera& operator=(const Camera&) = delete;

    bool Init(const DeviceConfig& cfg);
    bool StartStream();
    void StopStream();
    void Destroy();

    bool GetFrame(Frame& frame, int timeout_ms = 1000);

    using FrameCallback = std::function<void(const Frame&)>;
    using EventCallback = std::function<void(const EventPacket&)>;
    using ImageCallback = std::function<void(const ImageData&)>;
    void SetFrameCallback(FrameCallback cb);
    void SetEventCallback(EventCallback cb);
    void SetImageCallback(ImageCallback cb);

    bool SetExposure(int value);
    bool SetFrameRate(unsigned fps);
    bool GetFrameRate(unsigned& fps);
    bool SyncClock();
};
} // namespace Shimeta::hv

Init

【语法】bool Init(const DeviceConfig& cfg);

【描述】按 DeviceConfig 初始化后端(不阻塞打开硬件;部分后端在 StartStream 才实际连接设备)。

【参数】

参数类型描述
cfgconst DeviceConfig& (in)采集配置:后端类型 + VID/PID / IP / sensor_index 等

【返回值】

返回值描述
true配置已接受,后端初始化成功
false配置无效(未知后端 / 必填字段缺失 / 参数越界)

【注意】

  • Init 不打开硬件,实际连接发生在 StartStream。
  • 可多次调用(内部先 Destroy 再重新初始化)。

【举例】

Shimeta::hv::DeviceConfig cfg;
cfg.backend    = Shimeta::hv::Backend::Usb;
cfg.vendor_id  = 0x1d6b;
cfg.product_id = 0x0105;
cam.Init(cfg);

StartStream

【语法】bool StartStream();

【描述】启动采集线程并连接设备。这是实际打开硬件、开始数据传输的入口。

【参数】无。

【返回值】

返回值描述
true成功连接设备并启动采集
false设备未找到 / 权限不足 / 已被占用

【注意】

  • 必须先调用 Init。
  • 返回 false 时不产生异常,可检查 Status 或重试。

【举例】

if (!cam.StartStream()) {
    std::cerr << "无法连接设备,请检查 USB 连接与权限" << std::endl;
    return 1;
}

GetFrame

【语法】bool GetFrame(Frame& frame, int timeout_ms = 1000);

【描述】同步拉取一帧组合数据(EVS 事件 + APS 图像),阻塞直到取到帧或超时。

【参数】

参数类型描述
frameFrame& (out)输出帧;aps/evs 为池内存只读视图,*_owner 持有 slab 引用
timeout_msint (in)超时毫秒数,默认 1000

【返回值】

返回值描述
true在超时内取到帧
false超时未取到(设备未连接 / 采集已停止 / 数据耗尽)

【注意】

  • frame.evs 是 HAL 未解码的原始事件字节(USB 通常为 EVT2),需用 Evt2Decoder/Evt3Decoder 解码。
  • frame.aps 为原始 APS 字节,格式由 frame.format 决定;S100/USB 通常为 NV12,X5 为 Gray8。应用层按格式转换。
  • 同一 Frame 实例可重复传入;每次调用覆盖其内容。

【举例】

Shimeta::codec::Evt2Decoder dec;
Shimeta::Frame f;
while (cam.GetFrame(f, 1000)) {
    std::vector<Shimeta::EventCD> events;
    dec.Decode(f.evs.data, f.evs.size, events);   // 解码事件
    // f.aps.data / f.aps.size → NV12,应用层 cvtColor
}

SetFrameCallback / SetEventCallback / SetImageCallback

【语法】

void SetFrameCallback(FrameCallback cb);    // 组合帧(事件 + APS)
void SetEventCallback(EventCallback cb);    // 原始事件包
void SetImageCallback(ImageCallback cb);    // APS 图像

【描述】注册异步回调。回调仅在派发线程串行触发,采集线程不回调。三个回调可同时注册、互不干扰。

【参数】

参数类型描述
cbFrameCallback / EventCallback / ImageCallback (in)回调函数对象;传 nullptr 取消该回调

【返回值】无。

【注意】

  • 回调在内部派发线程执行,不要在回调中阻塞或反向调用相机的同步接口(如 GetFrame、StopStream)。
  • 重计算应转存到工作线程处理。
  • EventCallback 收到的是 EventPacket(原始字节),同样需 codec 解码。

【举例】

cam.SetEventCallback([&dec](const Shimeta::hv::EventPacket& pkt) {
    std::vector<Shimeta::EventCD> events;
    dec.Decode(pkt.data.data, pkt.data.size, events);
    // 处理 events(在工作线程,勿阻塞回调)
});

SetExposure

【语法】bool SetExposure(int value);

【描述】设置 APS 曝光值。

【参数】

参数类型描述
valueint (in)曝光值(设备定义的单位,一般越大越亮)

【返回值】

返回值描述
true设置成功
false设备不支持 / 未连接

【注意】仅对支持 APS 的后端生效(USB / MipiHvs)。

【举例】无。


SetFrameRate / GetFrameRate

【语法】

bool SetFrameRate(unsigned fps);
bool GetFrameRate(unsigned& fps);

【描述】设置 / 读取 EVS 事件帧率。

【参数】

参数类型描述
fpsunsigned (in/out)帧率(fps);GetFrameRate 为输出参数

【返回值】

返回值描述
true成功
false后端不支持 / 未连接

【注意】当前支持 USB / Ethernet 后端;MIPI 后端用 DeviceConfig.evs_fps 在 Init 时设置。

【举例】

cam.SetFrameRate(120);           // 设为 120 fps
unsigned current;
cam.GetFrameRate(current);       // 读当前帧率

StopStream / Destroy / SyncClock

【语法】

void StopStream();
void Destroy();
bool SyncClock();

【描述】

方法描述
StopStream()停止采集并 join 采集线程(阻塞直到线程退出)。
Destroy()释放后端资源(可在 StopStream 后或代替它调用)。
SyncClock()时钟同步(Ethernet PTP mode 0 等)。

【参数】无。

【返回值】

方法返回值描述
StopStream / Destroyvoid—
SyncClockbooltrue=同步成功;false=后端不支持或未连接

【注意】推荐的关闭顺序:StopStream() → Destroy()。

【举例】

cam.StopStream();
cam.Destroy();

Shimeta::hv::EventPacket / ImageData

#include <shimetapi/hv/event_packet.h>#include <shimetapi/hv/image_data.h>

作用:EventPacket 是一包事件原始字节(HAL 未解码),用于 EventCallback;ImageData 是一帧 APS 图像 + 元信息,用于 ImageCallback。

namespace Shimeta::hv {
struct EventPacket {
    BufferView data{};       // 一包事件原始字节
    int64_t    t_begin_ns = 0;
    int64_t    t_end_ns   = 0;
};
struct ImageData {
    BufferView    pixels{};
    int           width = 0, height = 0;
    PixelFormat   format{};
    TimestampInfo ts{};
};
}

codec

头文件:<shimetapi/codec/evt2_codec.h>、<shimetapi/codec/evt3_codec.h>、<shimetapi/codec/mipi_raw8_codec.h>。命名空间 Shimeta::codec。

API主要用途具体函数 / 成员
Evt2Encoder / Evt2Decoder编码和解码 USB 默认使用的 EVT2 事件字节流。Encode() / Decode() / Reset()
Evt3Encoder / Evt3Decoder编码和解码 EVT3 事件字节流。Encode() / Decode() / Reset()
MipiRaw8Decoder将 MIPI HVS 的 apx003 RAW8 子帧流解码为事件。Decode() / Reset()
extractEvsTimestamp从 MIPI RAW8 子帧头提取 EVS 传感器时间戳。extractEvsTimestamp(data, len)

EVT2

32-bit word 流,USB 默认。

class Evt2Encoder {
public:
    Evt2Encoder();
    void Encode(const EventCD* events, size_t count, std::vector<uint8_t>& out);
    void Reset();
};
class Evt2Decoder {
public:
    Evt2Decoder();
    size_t Decode(const uint8_t* buffer, size_t buffer_size, std::vector<EventCD>& out);
    void Reset();
};

Evt2Encoder::Encode

【语法】void Encode(const EventCD* events, size_t count, std::vector<uint8_t>& out);

【描述】把 count 个事件编码为 EVT2 32-bit word 字节流(含必要的 TimeHigh 冗余字),追加到 out。

【参数】

参数类型描述
eventsconst EventCD* (in)事件数组指针
countsize_t (in)事件数量
outstd::vector<uint8_t>& (out)输出字节(追加,不清空)

【返回值】无。

【注意】编码器有状态(维护 time-base),多包流请复用同一实例;新流前调用 Reset()。

【举例】

Shimeta::codec::Evt2Encoder enc;
std::vector<Shimeta::EventCD> events = { /* ... */ };
std::vector<uint8_t> raw;
enc.Encode(events.data(), events.size(), raw);

Evt2Decoder::Decode

【语法】size_t Decode(const uint8_t* buffer, size_t buffer_size, std::vector<EventCD>& out);

【描述】解码 EVT2 32-bit word 字节流,将 CD 事件追加到 out。

【参数】

参数类型描述
bufferconst uint8_t* (in)输入字节
buffer_sizesize_t (in)输入字节数
outstd::vector<EventCD>& (out)输出事件(追加,不清空)

【返回值】

返回值描述
size_t本次调用解码出的 CD 事件数

【注意】

  • 解码器有状态(跨包维护 time-base / 翻转计数),多包流请复用同一实例。
  • 新流前调用 Reset()。

【举例】

Shimeta::codec::Evt2Decoder dec;
std::vector<Shimeta::EventCD> events;
size_t n = dec.Decode(frame.evs.data, frame.evs.size, events);

Evt2Encoder::Reset / Evt2Decoder::Reset

【语法】

void Evt2Encoder::Reset();   // 重置编码器(下次从 time-base 0 起)
void Evt2Decoder::Reset();   // 清除解码状态(新流前调用)

【参数】无。【返回值】无。【注意】切换到新的事件流(如新文件、新录制段)时必须调用。【举例】无。

EVT3

16-bit word 流。

class Evt3Encoder {
public:
    Evt3Encoder();
    void Encode(const EventCD* events, size_t count, std::vector<uint8_t>& out);
    void Reset();
};
class Evt3Decoder {
public:
    Evt3Decoder();
    size_t Decode(const uint8_t* buf, size_t len, std::vector<EventCD>& out);
    void Reset();
};

Evt3Encoder::Encode

【语法】void Encode(const EventCD* events, size_t count, std::vector<uint8_t>& out);

【描述】把 count 个事件编码为 EVT3 16-bit word 字节流,追加到 out。

【参数】同 Evt2Encoder::Encode。

【返回值】无。

【注意】有状态,同 EVT2 规则。【举例】无。


Evt3Decoder::Decode

【语法】size_t Decode(const uint8_t* buf, size_t len, std::vector<EventCD>& out);

【描述】解码 EVT3 16-bit word 字节流为 CD 事件。

【参数】

参数类型描述
bufconst uint8_t* (in)输入字节
lensize_t (in)必须为 2 的倍数(16-bit 对齐)
outstd::vector<EventCD>& (out)输出事件(追加)

【返回值】

返回值描述
size_t本次调用解码出的 CD 事件数

【注意】len 必须为偶数;否则行为未定义。其余同 Evt2Decoder::Decode(有状态、新流前 Reset)。

【举例】

Shimeta::codec::Evt3Decoder dec;
std::vector<Shimeta::EventCD> events;
dec.Decode(frame.evs.data, frame.evs.size, events);

Evt3Encoder::Reset / Evt3Decoder::Reset

同 EVT2,新流前调用。

MIPI RAW8

apx003 子帧流

作用:MipiRaw8Decoder 解码 apx003 RAW8 子帧流为 EventCD,无状态。USB 后端不产生 RAW8,通常无需此类。详见 C++ API。

class MipiRaw8Decoder {
public:
    MipiRaw8Decoder() = default;
    // subframe_count<=0 为自动档:按 len/kSubframeBytes 解全部子帧
    // (各帧率档整包子帧数不同:120fps=16 … 1000fps=128)
    size_t Decode(const uint8_t* data, size_t len, std::vector<EventCD>& out,
                  int subframe_count = 0);
    void Reset();  // 无状态,no-op
};

MipiRaw8Decoder::Decode

【语法】size_t Decode(const uint8_t* data, size_t len, std::vector<EventCD>& out, int subframe_count = 0);

【描述】解码 apx003 RAW8 子帧流为 CD 事件。无状态(无跨包时间戳维护)。

【参数】

参数类型描述
dataconst uint8_t* (in)RAW8 字节
lensize_t (in)字节数
outstd::vector<EventCD>& (out)输出事件(追加)
subframe_countint (in)子帧数;≤0 = 自动档按 len 全部解,>0 = 仅前 N 个

【返回值】

返回值描述
size_t本次解码出的 CD 事件数

【注意】仅用于 MIPI HVS 后端的 Frame.evs(RAW8 子帧流),不能用于 EVT2/EVT3 字节流。

【举例】

Shimeta::codec::MipiRaw8Decoder dec;
std::vector<Shimeta::EventCD> events;
dec.Decode(frame.evs.data, frame.evs.size, events);

extractEvsTimestamp

【语法】Shimeta::EvsTimestamp extractEvsTimestamp(const uint8_t* data, size_t len);

【描述】从 apx003 RAW8 子帧头提取传感器时间戳(45-bit / 200 → 微秒)。顺序遍历子帧,取第一个头掩码匹配的。

【参数】

参数类型描述
dataconst uint8_t* (in)RAW8 字节(至少含一个完整子帧 32768B)
lensize_t (in)字节数

【返回值】

返回值描述
EvsTimestampvalid=true → processed_timestamp 为微秒;valid=false → 未找到匹配子帧

【注意】与 MipiRaw8Decoder 配合使用:先提取时间戳、再解码事件。

【举例】

auto ts = Shimeta::codec::extractEvsTimestamp(frame.evs.data, frame.evs.size);
if (ts.valid) { /* ts.processed_timestamp = 微秒 */ }

io

头文件:<shimetapi/io/event_reader.h>、<shimetapi/io/event_writer.h>、<shimetapi/io/hybrid_writer.h>、<shimetapi/io/hybrid_reader.h>。命名空间 Shimeta::io。

API主要用途具体函数 / 成员
RawFormat标记 RAW 事件文件的 EVT2、EVT3 或未知格式。Evt2 / Evt3 / Unknown
EventReader打开、识别并读取 RAW 事件文件。open() / readAllEvents() / format() / imageSize() / close()
EventWriter将原始事件字节或事件对象写入 RAW 文件。open() / writeRaw() / writeEvents() / flush() / close()
HybridWriter将 EVS 事件和 APS 图像录制为配套文件。open() / writeFrame() / apsFrameCount() / close()
HybridReader读取由 HybridWriter 生成的 EVS 和 APS 录像。open() / readApsFrame() / readEvsPacket() / close()

Shimeta::io::RawFormat

#include <shimetapi/io/event_reader.h>

enum class RawFormat { Evt2, Evt3, Unknown };

Shimeta::io::EventReader

#include <shimetapi/io/event_reader.h>

作用:读取 RAW 事件文件(.raw),按文件头 ev_version 自动选 EVT2/EVT3 解码为 EventCD。

class EventReader {
public:
    bool open(const std::string& filename);
    void close();
    bool isOpen() const;
    RawFormat format() const;
    std::pair<uint32_t, uint32_t> imageSize() const;
    size_t readAllEvents(std::vector<EventCD>& events);
    void reset();
};

open

【语法】bool open(const std::string& filename);

【描述】打开 RAW 文件并解析文件头(自动识别 EVT2/EVT3)。

【参数】

参数类型描述
filenameconst std::string& (in)RAW 文件路径

【返回值】

返回值描述
true打开成功
false文件不存在 / 格式无效

【注意】打开后可用 format() / imageSize() 查询元信息。【举例】

Shimeta::io::EventReader reader;
reader.open("events.raw");

readAllEvents

【语法】size_t readAllEvents(std::vector<EventCD>& events);

【描述】读取并解码文件中全部事件到 events。

【参数】

参数类型描述
eventsstd::vector<EventCD>& (out)输出事件向量

【返回值】

返回值描述
size_t读取的事件总数

【注意】大文件会占用大量内存(一次性读入);v2.0 暂无流式分批读取。

【举例】

std::vector<Shimeta::EventCD> events;
size_t n = reader.readAllEvents(events);

format / imageSize / isOpen / close / reset

【语法】

RawFormat format() const;                            // 文件实际事件格式
std::pair<uint32_t, uint32_t> imageSize() const;      // 传感器 {width, height}
bool isOpen() const;                                  // 文件是否已打开
void close();                                         // 关闭文件
void reset();                                         // 读位置回到数据区起点

【描述】查询与控制。

【参数】无。【返回值】见签名。【注意】reset() 可重复读取同一文件。【举例】无。

Shimeta::io::EventWriter

#include <shimetapi/io/event_writer.h>

作用:把事件写入 RAW 文件;支持原始字节透传(Frame.evs 直写)和事件编码写入两种路径。

class EventWriter {
public:
    bool open(const std::string& filename, uint32_t width, uint32_t height,
              RawFormat fmt = RawFormat::Evt3, uint64_t start_timestamp = 0);
    void close();
    bool isOpen() const;
    size_t writeRaw(const uint8_t* data, size_t len);
    size_t writeEvents(const std::vector<EventCD>& events);
    void flush();
    uint64_t writtenEventCount() const;
};

open

【语法】bool open(const std::string& filename, uint32_t width, uint32_t height, RawFormat fmt = RawFormat::Evt3, uint64_t start_timestamp = 0);

【描述】创建新文件并写入文件头。

【参数】

参数类型描述
filenameconst std::string& (in)输出文件路径
widthuint32_t (in)传感器宽度
heightuint32_t (in)传感器高度
fmtRawFormat (in)决定头 ev_version,默认 Evt3
start_timestampuint64_t (in)起始时间戳(微秒),默认 0

【返回值】bool(是否成功创建)。【注意】若文件已存在将被覆盖。【举例】无。


writeRaw

【语法】size_t writeRaw(const uint8_t* data, size_t len);

【描述】原始字节透传写入(Frame.evs 直写,不再编码)—— 最快。

【参数】

参数类型描述
dataconst uint8_t* (in)原始事件字节
lensize_t (in)字节数

【返回值】size_t(写入字节数)。

【注意】要求写入的字节本身已是目标格式(EVT2/EVT3);不更新 writtenEventCount()。

【举例】

writer.writeRaw(frame.evs.data, frame.evs.size);   // Frame.evs 直写

writeEvents

【语法】size_t writeEvents(const std::vector<EventCD>& events);

【描述】用 Evt2Encoder 编码事件后写入。

【参数】

参数类型描述
eventsconst std::vector<EventCD>& (in)待写入的事件向量

【返回值】size_t(写入事件数)。【注意】更新 writtenEventCount()。【举例】无。


flush / writtenEventCount / isOpen / close

【语法】

void flush();                    // 强制刷新缓冲到磁盘
uint64_t writtenEventCount() const;  // 已写入事件累计数
bool isOpen() const;
void close();                    // 关闭(自动 flush)

【参数】无。【返回值】见签名。【注意】采集结束务必 flush() 或 close(),确保数据落盘。【举例】无。

Shimeta::io::HybridWriter

#include <shimetapi/io/hybrid_writer.h>

作用:混合录制门面 —— EVS 存为 RAW 事件文件(复用 EventWriter),APS 原始帧存为 AVI(含 tsmp 时间戳 chunk)。APS 格式按输入 Frame.format 处理。

class HybridWriter {
public:
    ~HybridWriter();
    bool open(const std::string& evs_path, const std::string& aps_path,
              uint32_t width, uint32_t height, RawFormat evs_format = RawFormat::Evt3,
              double aps_fps = 30.0);
    bool writeFrame(const Shimeta::Frame& frame, const Shimeta::EvsTimestamp* evs_ts = nullptr);
    void close();
    uint32_t apsFrameCount() const;
};

open

【语法】bool open(const std::string& evs_path, const std::string& aps_path, uint32_t width, uint32_t height, RawFormat evs_format = RawFormat::Evt3, double aps_fps = 30.0);

【描述】打开 EVS / APS 两路输出文件。

【参数】

参数类型描述
evs_pathconst std::string& (in)EVS raw 文件路径
aps_pathconst std::string& (in)APS AVI 文件路径
width / heightuint32_t (in)传感器宽 / 高
evs_formatRawFormat (in)EVS 文件格式,默认 Evt3
aps_fpsdouble (in)仅写入 AVI 头,不控制采集,默认 30.0

【返回值】bool。【注意】文件已存在会被覆盖。【举例】

Shimeta::io::HybridWriter hw;
hw.open("events.raw", "aps.avi", 768, 608);

writeFrame

【语法】bool writeFrame(const Shimeta::Frame& frame, const Shimeta::EvsTimestamp* evs_ts = nullptr);

【描述】写一帧:EVS 走 writeRaw,APS 按 Frame.format 写入 AVI。

【参数】

参数类型描述
frameconst Shimeta::Frame& (in)待写入的帧(frame.evs + frame.aps)
evs_tsconst Shimeta::EvsTimestamp* (in, 可选)EVS 传感器时间戳;注入 AVI tsmp chunk,默认 nullptr

【返回值】bool。【注意】evs_ts 可用 extractEvsTimestamp(frame.evs.data, frame.evs.size) 提取。【举例】

auto ts = Shimeta::codec::extractEvsTimestamp(frame.evs.data, frame.evs.size);
hw.writeFrame(frame, &ts);

close / apsFrameCount

【语法】

void close();                  // 关闭两路输出并收尾 AVI 索引
uint32_t apsFrameCount() const; // 已写入的 APS 帧数

【参数】无。【返回值】见签名。【注意】close() 自动 flush。【举例】无。

Shimeta::io::HybridReader

#include <shimetapi/io/hybrid_reader.h>

作用:HybridWriter 的读取对偶 —— 读取其产出的混合录像(EVS raw + APS AVI,含 tsmp chunk)。与 Camera 一样返回原始字节,应用自行按格式解码。

class HybridReader {
public:
    HybridReader(); ~HybridReader();
    bool open(const std::string& evs_path, const std::string& aps_path);
    void close();
    bool isOpen() const;
    uint32_t width() const;
    uint32_t height() const;
    double   apsFps() const;
    uint32_t apsFrameCount() const;
    bool readApsFrame(Shimeta::Frame& out, Shimeta::EvsTimestamp* evs_ts = nullptr);
    bool readEvsPacket(Shimeta::Frame& out, size_t packet_bytes = 0);
};

open

【语法】bool open(const std::string& evs_path, const std::string& aps_path);

【描述】打开 EVS / APS 两路文件;任一路径为空则跳过该侧。

【参数】

参数类型描述
evs_pathconst std::string& (in)EVS raw 文件路径(空 = 不读 EVS)
aps_pathconst std::string& (in)APS AVI 文件路径(空 = 不读 APS)

【返回值】bool(两路均需成功打开对应文件)。

【注意】APS 侧解析 RIFF/AVI 头;输入/输出格式由录制时的 APS 帧格式决定(S100/USB 通常为 NV12,X5 为 Gray8);EVS 侧自动跳过 EVT3 文本头。

【举例】

Shimeta::io::HybridReader hr;
hr.open("events.raw", "aps.avi");

readApsFrame

【语法】bool readApsFrame(Shimeta::Frame& out, Shimeta::EvsTimestamp* evs_ts = nullptr);

【描述】顺序读下一帧 APS 原始字节,格式由 .format 标记。

【参数】

参数类型描述
outShimeta::Frame& (out)填充 .aps + .format/.width/.height/.ts.aps_ts_ns
evs_tsShimeta::EvsTimestamp* (out, 可选)该帧的传感器时间戳(从 AVI tsmp chunk 提取)

【返回值】

返回值描述
true成功读取一帧
false到达文件末尾 / APS 未打开

【注意】

  • out.aps.data 为 APS 原始字节;应用层需根据 out.format 解码(NV12 转 BGR,Gray8 直接作为灰度图)。
  • out.aps_owner 持有 slab,Frame 离开 reader 后仍有效(自包含)。

【举例】

Shimeta::Frame f;
Shimeta::EvsTimestamp ts;
while (hr.readApsFrame(f, &ts)) {
    // f.aps.data:按 f.format 解码(NV12 或 Gray8)
    // ts.processed_timestamp = 微秒
}

readEvsPacket

【语法】bool readEvsPacket(Shimeta::Frame& out, size_t packet_bytes = 0);

【描述】顺序读下一包 EVS 原始字节(已跳过 EVT3 文本头)。

【参数】

参数类型描述
outShimeta::Frame& (out)填充 .evs(owner 自包含)
packet_bytessize_t (in)每次读取字节数;0 = 默认 1 MiB(apx003 RAW8 单包 32768×32)

【返回值】

返回值描述
true成功读取(out.evs.size 为实际读到的字节数,末包可能 < packet_bytes)
false到达文件末尾 / EVS 未打开

【注意】读到的原始字节需用 MipiRaw8Decoder(MIPI RAW8)或 Evt2Decoder/Evt3Decoder(EVT2/3)解码。

【举例】

Shimeta::codec::MipiRaw8Decoder dec;
Shimeta::Frame f;
while (hr.readEvsPacket(f)) {
    std::vector<Shimeta::EventCD> events;
    dec.Decode(f.evs.data, f.evs.size, events);
}

width / height / apsFps / apsFrameCount / isOpen / close

【语法】

uint32_t width() const;          // APS 宽
uint32_t height() const;         // APS 高
double   apsFps() const;         // AVI 头帧率(无效回退 30.0)
uint32_t apsFrameCount() const;  // AVI 头声明的总帧数
bool isOpen() const;
void close();

【参数】无。【返回值】见签名。【注意】无。【举例】无。

MIPI 注意事项

APS 图像

Backend::MipiHvs 的 Frame.aps 由 VC1 通道提供,格式依板卡而异:

板卡Frame.format路径应用处理
S100NV12(彩色)ISP→PYM 处理后cv::cvtColorTwoPlane 转 BGR
X5Gray8(灰度)VIN 直读 RAW10(ISP 2A ioctl 受限,bypass 属预期行为)直接作为灰度图使用

Backend::Mipi(EVS-only)不提供 APS。

许可证

Apache License 2.0。EVT2/EVT3 编解码为基于公开规范的独立实现(clean-room),不含第三方闭源源码。

在 GitHub 上编辑此页
Prev
02 快速上手
Next
04 Python API