首页
商城
  • 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 MTCNN 人脸检测应用
    • 开源鸿蒙

      • 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升级
        • 六、资料下载

          • 资料下载
    • EVS相机

      • CF-NRS1

        • 一、简介

          • 01-产品介绍
          • 02-相关概念
          • 03-MultiVision Studio 介绍
        • 二、开发

          • 01-ShiMetaPi Hybrid vision SDK 介绍
          • 02-Hybrid_vision_toolkit
          • 03-Hybrid_vision_toolkit API (C++)
          • 04 Hybrid Vision algo
          • 05 Hybrid vision algo API
          • 06 EVS Network Server
          • 07 EVS Time Sync
          • 08 Web Window
        • 三、资料下载

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

          • 常见问题解决指南
      • CF-CRA2

        • 一、简介

          • CF-NRS2 简介
        • 二、资料下载

          • 资料下载
      • EVS模块

        • 一、相关概念
        • 二、硬件准备与环境配置
        • 三、示例程序使用指南
        • 资料下载
    • 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

        • 一、简介

          • RK1828 AI 协处理器
        • 二、快速开始

          • 硬件安装与验证
          • 视美泰AI龙虾一键部署
        • 三、开发指南

          • ClawChips 架构与原理
          • SKILL 使用手册
          • LLM 推理
          • CNN 推理
          • 模型转换
          • SDK 参考

            • RKNN3 SDK 概述
            • RKNN3 Toolkit 安装与使用
            • RKLLM
        • 四、资料下载

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

          • 常见问题
    • 核心板

      • C-3568BQ

        • 简介

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

        • 简介

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

        • 简介

          • GC-3568JBAF 简介
      • C-K1BA

        • 简介

          • C-K1BA 简介

API使用说明

Algo SDK 是一款专为evs device 设计的软件开发工具包,提供了算法的功能和简便的操作方式,帮助开发者轻松集成各项功能。

环境配置

请确保您的开发环境中已安装以下必备组件:

  • 操作系统: windows 10 64 位
  • 编译器: 适用于您的操作系统的 C/C++ 编译器
  • 依赖库: 确保安装了必要的库,OpenCV,我们会提供SDK对于的OpenCV版本,自行配置环境变量即可。
  • 开发工具: 如 IDE(Visual Studio 2019等)

建议: 开发路径使用全英文

Algo模块说明

Algo库主要分为三个模块:

  1. OpticalFlow

    • 功能: 该API是基于EVS的光流实现。
  2. HandDetector

    • 功能: 该API是基于EVS的手形检测器实现。
  3. HumanDetector

    • 功能: 该API是基于EVS的人形检测器实现。

Algo目录说明

  • bin目录: 包含所有核心库及依赖库
  • docs目录: 包含接口说明文档
  • include目录: 包含接口头文件
  • lib目录: 包含所有开发库的lib文件
  • models目录: 包含训练模型数据
  • samples_cpp目录: 包含操作设备的简单样例,运行样例需要 OpenCV 环境

注意: 编译样例后运需要把models目录、bin目录下动态库,拷贝到.exe可执行文件同一目录。

1.OpticalFlow

该API是基于EVS的光流实现。

Of函数

Of函数是光流类的初始化构造函数,参数释义如下:

    Of(
    uint16_t width,
    uint16_t height,
    uint8_t scale,
    uint8_t search_radius,
    uint8_t block_dimension);
  • width:EVS图像的宽。
  • height:EVS图像的高。
  • scale:EVS降采样倍数。
  • search_radius:表示的是光流搜索半径大小,通常建议为4。
  • block_dimension:表示的是光流计算相关特征所用的图像大小,通常建议为21,越大越准确但效率降低。

run函数

run函数是运行光流算法的核心函数,参数释义如下:

    int run(
    const cv::Mat& in_img,
    cv::Mat& out_img,
    uint8_t stack_nums = 1);
  • in_img:表示用来计算光流的EVS输入图像。通常0表示没有事件,1和2分别表示正负事件。
  • out_img:表示计算出的光流图像,用CV_8SC2类型来表示。每个像素的两个通道的值分别表示x,y的光流大小,符号表示方向
  • stack_nums:EVS叠帧的数量,默认为1,表示不叠帧,通常事件稀疏需要叠帧。

showOf函数

showOf函数是将run函数得到的光流图像用HVS空间箭头可视化出来,参数释义如下:

    int showOf(
    cv::Mat& of_result,
    cv::Mat& of_mask,
	uint8_t ratio = 2,
    uint8_t step = 2);
  • of_result:表示run函数计算出的光流图像。
  • of_mask:表示将of_result可视化后的光流的结果。
  • ratio:表示将可视化的光流箭头同比放大多少倍。
  • step:表示将可视化的光流箭头稀疏采样多少倍。

用例

// 使用光流算法
#include <AlpOpticalFlow/Of.h>

#include <iostream>
#include <iomanip>
#include <sstream>
#include <chrono>
#include <thread>
#include <ctime>
#include <regex>
#include <filesystem>
#include <fstream>

namespace fs = std::filesystem;
using  namespace ALP;

/**
 * @brief 用于存储和管理程序运行时所需的各种变量
 *
 * 该结构体包含处理 EVS 数据帧所需的成员变量,以及相关的线程和锁。
 */
struct SampleVar
{

    // 保护 EVS 数据帧列表的互斥锁
    std::mutex evs_mutex_;
    // 标记是否关闭数据处理
    bool is_close_ = false;
    // 播放 EVS 数据的线程
    std::unique_ptr<std::thread > evs_thread_;
    // 是否开启 EVS 数据存储
    bool is_evs_show_ = false;
    // evs 图像的宽度
    int evs_width_ = 768;
    // evs 图像的高度
    int evs_height_ = 608;

    std::string evs_image_dir_ = "C:/Users/SMTPC-0430/Desktop/Pic/EVS_RAW";//D:/TestData/Human/20250115161806780/evs_raw

    // 创建光流类
    std::shared_ptr<Of> optical_flow_ = nullptr;
};

std::shared_ptr<SampleVar> var_ = std::make_shared<SampleVar>();


/*
* @brief readRawImage 采用二进制方式读取 .raw 文件,并将其转换为 cv::Mat,以 8-bit 灰度格式解析数据。
*
* 直接使用 cv::imread 读取 .raw 文件会失败,因为它不是标准图片格式。
* 
*/

cv::Mat readRawImage(const std::string& filename, int width, int height)
{
    std::ifstream file(filename, std::ios::binary);
    if (!file) {
        std::cerr << "ERROR: Cannot open file: " << filename << std::endl;
        return cv::Mat();
    }

    cv::Mat image(height, width, CV_8UC1); // 8-bit 单通道灰度图
    image *= 100;
    file.read(reinterpret_cast<char*>(image.data), width * height);

    if (file.gcount() != width * height) {
        std::cerr << "WARNING: File size mismatch: " << filename << std::endl;
        return cv::Mat();
    }

    return image;
}


/**
 * @brief 显示 EVS 图像界面(本地文件版本)
 *
 * 该函数创建一个新的线程来处理和显示本地存储的EVS图像文件。
 * 图像文件将按文件系统顺序循环读取,并计算/显示光流信息。
 */
void displayEVS()
{
    var_->evs_thread_ = std::make_unique<std::thread>([&]()
        {
            var_->is_evs_show_ = true;

            std::vector<std::string> image_files;
            for (const auto& entry : fs::directory_iterator(var_->evs_image_dir_)) {
                if (entry.path().extension() == ".raw") {
                    image_files.push_back(entry.path().string());
                }
            }

            if (image_files.empty()) {
                std::cerr << "ERROR: No image files found in " << var_->evs_image_dir_ << std::endl;
                var_->is_evs_show_ = false;
                return;
            }

            std::sort(image_files.begin(), image_files.end()); // 确保按顺序处理
            size_t frame_index = 0;
            const int frame_delay = 30;

            while (!var_->is_close_) {
                cv::Mat tem = readRawImage(image_files[frame_index], var_->evs_width_, var_->evs_height_);
                if (tem.empty()) {
                    frame_index = (frame_index + 1) % image_files.size();
                    continue;
                }

                cv::Mat out;
                if (!var_->optical_flow_->run(tem, out, 10)) {
                    cv::Mat of_mask;
                    var_->optical_flow_->showOf(out, of_mask, 10, 3);
                    cv::namedWindow("of", cv::WINDOW_FREERATIO);
                    cv::imshow("of", of_mask);
                    cv::waitKey(1);
                }

                frame_index = (frame_index + 1) % image_files.size();
                std::this_thread::sleep_for(std::chrono::milliseconds(frame_delay));
            }

            var_->is_evs_show_ = false;
        });
}




/**
 * @brief 关闭设备
 *
 * 该函数用于关闭 Eiger 设备,停止所有数据流,并释放相关资源。
 */
void closeDevice()
{
    // 等待 EVS 显示线程结束
    if (var_->evs_thread_)
    {
        var_->evs_thread_->join();
        var_->evs_thread_ = nullptr;
    }
}


int main(int argc, char* argv[])
{
    // 创建光流类
    var_->optical_flow_ = std::make_shared<Of>(var_->evs_width_, var_->evs_height_, 6, 4, 31);
    displayEVS();
    closeDevice();
    return 0;
}

效果

of_flow

2.HandDetector

HandDetector函数

此函数用来构造具有初始手检测器类型的HandDetector对象,参数释义如下:

HandDetector(HandDetectorType type);
  • type: aps or evs Currently only supports HumanDetectorType::evs

detect函数

输入图像进行检测,然后从方框和地标中获取结果,参数释义如下:

int detect  ( const cv::Mat & image,  
  std::vector< cv::Rect > & boxes,  
  std::vector< std::vector< cv::Point2f > > & landmarks ) ;
  • image:输入图像
  • boxes:表示检测到的手部框结果
  • landmarks:表示手的关键点

init函数

初始化函数,参数释义如下:

int init(const std::string& device="cpu");
  • cpu" or "cuda", defalut is "cpu"

用例

#pragma execution_character_set("utf-8")
/**********************************************
* 此样例为播放保存的evs raw数据          *
***********************************************/

//手势检测
#include <ALPML/HandDetector/hand_detector.h>

#include <iostream>
#include <iomanip>
#include <sstream>
#include <chrono>
#include <thread>
#include <ctime>
#include <regex>
#include <filesystem>
#include <fstream>


namespace fs = std::filesystem;
using  namespace ALP;

/**
 * @brief 用于存储和管理程序运行时所需的各种变量
 *
 * 该结构体包含处理 APS 和 EVS 数据帧所需的成员变量,以及相关的线程和锁。
 */
struct SampleVar
{
    // 保护 EVS 数据帧列表的互斥锁
    std::mutex evs_mutex_;
    // 标记是否关闭数据处理
    bool is_close_ = false;
    // 播放 EVS 数据的线程
    std::unique_ptr<std::thread > evs_thread_;
    // 是否开启 EVS 数据存储
    bool is_evs_show_ = false;
    // evs 图像的宽度
    int evs_width_ = 768;
    // evs 图像的高度
    int evs_height_ = 608;
    // WriterFile类的智能指针
    const int play_evs_ = 2;
    // 创建手势检测
    std::shared_ptr<HandDetector> detector_ = nullptr;


    std::string evs_image_dir_ = "C:/Users/SMTPC-0430/Desktop/Pic/EVS_RAW";
};

std::shared_ptr<SampleVar> var_ = std::make_shared<SampleVar>();

/*
* @brief readRawImage 采用二进制方式读取 .raw 文件,并将其转换为 cv::Mat,以 8-bit 灰度格式解析数据。
*
* 直接使用 cv::imread 读取 .raw 文件会失败,因为它不是标准图片格式。
*
*/
cv::Mat readRawImage(const std::string& filename, int width, int height)
{
    std::ifstream file(filename, std::ios::binary);
    if (!file) {
        std::cerr << "ERROR: Cannot open file: " << filename << std::endl;
        return cv::Mat();
    }

    cv::Mat image(height, width, CV_8UC1); // 8-bit 单通道灰度图
    image *= 100;
    file.read(reinterpret_cast<char*>(image.data), width * height);

    if (file.gcount() != width * height) {
        std::cerr << "WARNING: File size mismatch: " << filename << std::endl;
        return cv::Mat();
    }

    return image;
}

/**
 * @brief 显示 EVS 图像界面
 *
 * 该函数创建一个新的线程来处理和显示 EVS 数据帧。
 * 在这个线程中,会从 `var_->evs_frames_` 列表中获取最新的 EVS 数据帧,
 * 并将其转换为 OpenCV 的 Mat 对象进行显示。
 */

void displayEVS()
{
    // 创建一个新的线程来处理 EVS 数据帧的显示
    var_->evs_thread_ = std::make_unique<std::thread>([&]()
        {
            // 开始存储EVS数据
            var_->is_evs_show_ = true;
            std::vector<std::string> image_files;
            for (const auto& entry : fs::directory_iterator(var_->evs_image_dir_)) {
                if (entry.path().extension() == ".raw") {
                    image_files.push_back(entry.path().string());
                }
            }

            if (image_files.empty()) {
                std::cerr << "ERROR: No image files found in " << var_->evs_image_dir_ << std::endl;
                var_->is_evs_show_ = false;
                return;
            }

            std::sort(image_files.begin(), image_files.end()); // 确保按顺序处理
            size_t frame_index = 0;
            const int frame_delay = 15;
            // 主循环,持续处理 EVS 数据直到关闭标志被设置
            while (!var_->is_close_)
            {
                // 获取互斥锁以保护 EVS 数据帧列表
                std::unique_lock<std::mutex> locker(var_->evs_mutex_);



                    const cv::Mat tem = readRawImage(image_files[frame_index], var_->evs_width_, var_->evs_height_);
                    if (tem.empty()) {
                        frame_index = (frame_index + 1) % image_files.size();
                        continue;
                    }

                    if (var_->detector_) {
                        std::vector<cv::Rect> box;
                        std::vector<std::vector<cv::Point2f>> landmarks;
                        cv::Mat image = tem;
                        var_->detector_->detect(image, box, landmarks);
                        cv::cvtColor(image, image, cv::COLOR_GRAY2BGR);
                        image *= 100;
                        for (size_t i = 0; i < box.size(); i++) {
                            cv::rectangle(image, box[i], cv::Scalar(0, 0, 255), 2);
                        }
                        for (auto& landmark : landmarks) {
                            for (auto& point : landmark) {
                                cv::circle(image, point, 2, cv::Scalar(0, 0, 255), 2);
                            }
                        }
                        cv::imshow("image", image);
                        cv::waitKey(25);
                    }
                    frame_index = (frame_index + 1) % image_files.size();
     

            }

            // 停止存储EVS数据
            var_->is_evs_show_ = false;
        });
}


/**
 * @brief 关闭设备
 *
 * 该函数用于关闭 Eiger 设备,停止所有数据流,并释放相关资源。
 */
void closeDevice()
{
    // 等待 EVS 显示线程结束
    if (var_->evs_thread_)
    {
        var_->evs_thread_->join();
        var_->evs_thread_ = nullptr;
    }
}

int main(int argc, char* argv[])
{
    // 创建手势检测
    var_->detector_ = std::make_shared<HandDetector>(HandDetectorType::evs);
    var_->detector_->init("cpu");
    // 启动显示 EVS 图像的线程
    displayEVS();
    closeDevice();
    return 0;
}

效果

hand

3.HumanDetector

HumanDetector函数

此函数用来构造具有初始手检测器类型的HumanDetector对象,参数释义如下:

HumanDetector(HumanDetectorType type);
  • type: aps or evs Currently only supports HumanDetectorType::evs

detect函数

输入要检测的图像,然后从框中获取结果,参数释义如下:

int detect(const cv::Mat& image, std::vector<cv::Rect>& boxes);
  • image:输入图像
  • boxes:输出检测框

init函数

初始化函数,参数释义如下:

int init  ( const std::string & device = "cpu" )
  • device type:"cpu" or "cuda", defalut is "cpu"

用例

#pragma execution_character_set("utf-8")
/**********************************************
*  此样例为播放保存的evs raw数据          *
***********************************************/

// 人形检测
#include <AlpML/HumanDetector/human_detector.h>

#include <iostream>
#include <iomanip>
#include <sstream>
#include <chrono>
#include <thread>
#include <ctime>
#include <regex>
#include <filesystem>
#include <fstream>


namespace fs = std::filesystem;
using  namespace ALP;

/**
 * @brief 用于存储和管理程序运行时所需的各种变量
 *
 * 该结构体包含处理 APS 和 EVS 数据帧所需的成员变量,以及相关的线程和锁。
 */
struct SampleVar
{
    // 保护 EVS 数据帧列表的互斥锁
    std::mutex evs_mutex_;
    // 标记是否关闭数据处理
    bool is_close_ = false;
    // 播放 EVS 数据的线程
    std::unique_ptr<std::thread > evs_thread_;
    // 是否开启 EVS 数据存储
    bool is_evs_show_ = false;
    // evs 图像的宽度
    int evs_width_ = 768;
    // evs 图像的高度
    int evs_height_ = 608;

    const int play_evs_ = 2;

    std::string evs_image_dir_ = "C:/Users/SMTPC-0430/Desktop/Pic/human/EVS_RAW";//D:/TestData/Human/20250115161806780/evs_raw C:/Users/SMTPC-0430/Desktop/Pic/human/EVS_RAW

    // 创建人形检测类
    std::shared_ptr<ALP::HumanDetector> detector_ = nullptr;
};

std::shared_ptr<SampleVar> var_ = std::make_shared<SampleVar>();

/*
* @brief readRawImage 采用二进制方式读取 .raw 文件,并将其转换为 cv::Mat,以 8-bit 灰度格式解析数据。
*
* 直接使用 cv::imread 读取 .raw 文件会失败,因为它不是标准图片格式。
*
*/
cv::Mat readRawImage(const std::string& filename, int width, int height)
{
    std::ifstream file(filename, std::ios::binary);
    if (!file) {
        std::cerr << "ERROR: Cannot open file: " << filename << std::endl;
        return cv::Mat();
    }

    cv::Mat image(height, width, CV_8UC1); // 8-bit 单通道灰度图
    image *= 100;
    file.read(reinterpret_cast<char*>(image.data), width * height);

    if (file.gcount() != width * height) {
        std::cerr << "WARNING: File size mismatch: " << filename << std::endl;
        return cv::Mat();
    }

    return image;
}

/**
 * @brief 显示 EVS 图像界面
 *
 * 该函数创建一个新的线程来处理和显示 EVS 数据帧。
 * 在这个线程中,会从 `var_->evs_frames_` 列表中获取最新的 EVS 数据帧,
 * 并将其转换为 OpenCV 的 Mat 对象进行显示。
 */
void displayEVS()
{
    // 创建一个新的线程来处理 EVS 数据帧的显示
    var_->evs_thread_ = std::make_unique<std::thread>([&]()
        {
            // 开始存储EVS数据
            var_->is_evs_show_ = true;

            var_->is_evs_show_ = true;
            std::vector<std::string> image_files;
            for (const auto& entry : fs::directory_iterator(var_->evs_image_dir_)) {
                if (entry.path().extension() == ".raw") {
                    image_files.push_back(entry.path().string());
                }
            }

            if (image_files.empty()) {
                std::cerr << "ERROR: No image files found in " << var_->evs_image_dir_ << std::endl;
                var_->is_evs_show_ = false;
                return;
            }

            std::sort(image_files.begin(), image_files.end()); // 确保按顺序处理
            size_t frame_index = 0;
            const int frame_delay = 15;
            // 主循环,持续处理 EVS 数据直到关闭标志被设置
            while (!var_->is_close_)
            {
                // 获取互斥锁以保护 EVS 数据帧列表
                std::unique_lock<std::mutex> locker(var_->evs_mutex_);



                const cv::Mat tem = readRawImage(image_files[frame_index], var_->evs_width_, var_->evs_height_);
                if (tem.empty()) {
                    frame_index = (frame_index + 1) % image_files.size();
                    continue;
                }

                if (var_->detector_)
                {
                    std::vector<cv::Rect> box;
                    cv::Mat image = tem;
                    var_->detector_->detect(image, box);
                    cv::cvtColor(image, image, cv::COLOR_GRAY2BGR);
                    image *= 100;
                    for (size_t i = 0; i < box.size(); i++)
                    {
                        cv::rectangle(image, box[i], cv::Scalar(0, 0, 255), 2);
                    }
                    cv::imshow("image", image);
                    cv::waitKey(25);
                }
                frame_index = (frame_index + 1) % image_files.size();


            }

            // 停止存储EVS数据
            var_->is_evs_show_ = false;
        });

}


/**
 * @brief 关闭设备
 *
 * 该函数用于关闭 Eiger 设备,停止所有数据流,并释放相关资源。
 */
void closeDevice()
{
    // 等待 EVS 显示线程结束
    if (var_->evs_thread_)
    {
        var_->evs_thread_->join();
        var_->evs_thread_ = nullptr;
    }

}


int main(int argc, char* argv[])
{
    // 创建手势检测
    var_->detector_ = std::make_shared<HumanDetector>(HumanDetectorType::evs);
    var_->detector_->init("cpu");
    // 启动显示 EVS 图像的线程
    displayEVS();
    closeDevice();
    return 0;
}

效果

human

在 GitHub 上编辑此页
上次更新:
贡献者: szm