背景
为了方便客户做AI的应用,海思的芯片提供HiSVP
、HiIVE
等引擎。HiSVP
(HiSilicon Smart Vision Platform)是海思媒体处理芯片智能视觉异构加速平台。该平台包含了CPU
、DSP
、NNIE
(Neural Network Inference Engine)等多个硬件处理单元和运行在这些硬件上SDK
开发环境,以及配套的工具链开发环境。HiIVE
(HiSilicon Intelligent Video Engine)是海思媒体处理芯片智能分析系统中的硬件加速模块。用户基于 HiIVE
开发智能分析方案可以加速智能分析,降低 CPU
占用。 当前 HiIVE
提供的算子可以支撑开发视频诊断、周界防范等智能分析方案。
HiSVP
的开发框架如下图所示:
LinkSVP简介
LinkSVP
(Smart Vision Platform)整合了海思HiSVP
、HiIVE
、NCNN
、OpenCV
等,未来还会支持tensorflow
。LinkSVP
基于LinkLib
,因此,借助LinkLib
的便捷性,开发者无需处理底层视频传输,可以更专注于算法的设计与优化。开发者基于LinkFrame
类创建的对象,只需要设置目标算法需要的分辨率、帧率,系统会自动处理底层视频接口,开发者只需要在视频帧到达时调用其算法即可。
借助NCNN的整合,即使是在不支持NNIE的芯片上,也能进行简单的深度学习运算。
LinkSVP
的开发框架如下图所示:
UseHisiIVE图像二值化示例
该示例程序演示了如何使用海思官方的IVE
进行图像二值化操作。你也可以直接使用LinkIVE来实现改功能,参见LinkSVP例子之一:机器视觉基础演示,使用LinkIVE实现图像二值化。
准备工作
- 参照用户手册搭建开发环境、编译3531D工程、配置网络启动参数。
- 将带有HDMI输出功能的设备(如摄像机、笔记本、机顶盒等)接入评估板的HDMI-A接口
- 将评估板的HDMI-OUT接显示器(支持1080P即可,程序默认输出1080P60)。
- 上电,进入
/root/demo
目录 - 运行
UseHisiIVE
程序
运行结果
完整工程
完整工程参见:https://gitee.com/LinkPi/LinkSVP/tree/master/UseHisiIVE
主要源代码
main.cpp
#include <QCoreApplication>
#include "Link.h"
#include "Sample.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Link::init();
LinkObject *vi=Link::create("InputVi");
QVariantMap dataVi;
dataVi["interface"]="HDMI-A";
vi->start(dataVi);
Sample *SP=new Sample();
SP->start();
LinkObject *vo=Link::create("OutputVo");
QVariantMap dataVo;
dataVo["type"]="hdmi";
vo->start(dataVo);
vi->linkV(SP)->linkV(vo);
return a.exec();
}
Sample.cpp
#include "Sample.h"
Sample::Sample(QObject *parent) : LinkFrame(parent)
{
data["framerate"]=10;
data["width"]=1280;
data["height"]=720;
}
void Sample::oneFrame()
{
IVE_HANDLE handle;
IVE_THRESH_CTRL_S ctrlThresh;
ctrlThresh.u8LowThr=128;
ctrlThresh.u8HighThr=0;
ctrlThresh.enMode=IVE_THRESH_MODE_BINARY;
ctrlThresh.u8MaxVal=255;
ctrlThresh.u8MinVal=0;
IVE_SRC_IMAGE_S *memSrc=mem["in"].toImage(IVE_IMAGE_TYPE_U8C1);
IVE_SRC_IMAGE_S *memDst=mem["out"].toImage(IVE_IMAGE_TYPE_U8C1);
HI_S32 ret=HI_MPI_IVE_Thresh(&handle,memSrc, memDst, &ctrlThresh, HI_TRUE);
if(ret!=HI_SUCCESS)
{
qDebug("iveThresh error %#x",ret);
return;
}
HI_BOOL ff;
if(HI_ERR_IVE_SYS_TIMEOUT==HI_MPI_IVE_Query(handle, &ff, HI_TRUE))
qDebug("HI_MPI_IVE_Query HI_ERR_IVE_SYS_TIMEOUT");
}