前言

概述

本文档为使用媒体处理芯片的IVE协处理器进行_识别_分析方案开发的程序员而写,目的是供您在开发过程中查阅IVE协处理器支持的各种参考信息,包括API、头文件、错误码、Proc信息等。

说明: 本文未有特殊说明,SS927V100与SS928V100内容完全一致。

产品版本

与本文档相对应的产品版本如下。

产品名称

产品版本

SS928

V100

SS927

V100

读者对象

本文档(本指南)主要适用于以下工程师:

  • 技术支持工程师

  • 软件开发工程师

符号约定

在本文中可能出现下列标志,它们所代表的含义如下。

符号

说明

表示如不避免则将会导致死亡或严重伤害的具有高等级风险的危害。

表示如不避免则可能导致死亡或严重伤害的具有中等级风险的危害。

表示如不避免则可能导致轻微或中度伤害的具有低等级风险的危害。

用于传递设备或环境安全警示信息。如不避免则可能会导致设备损坏、数据丢失、设备性能降低或其它不可预知的结果。

“须知”不涉及人身伤害。

对正文中重点信息的补充说明。

“说明”不是安全警示信息,不涉及人身、设备及环境伤害信息。

修改记录

文档版本

发布日期

修改说明

00B01

2025-09-15

第1次临时版本发布

概述

概述

IVE(Identification Video Engine)是媒体处理芯片_识别_分析系统中的硬件加速模块。用户基于IVE开发_识别_分析方案可以加速_识别_分析,降低CPU占用。当前IVE提供的算子可以支撑开发视频诊断、周界防范等_识别_分析方案。

功能描述

重要概念

  • 句柄(handle)

    用户在调用算子创建任务时,系统会为每个任务分配一个handle,用于标识不同的任务。

  • 及时返回结果标志is_instant

    用户在创建某个任务后,希望及时得到该任务完成的信息,则需要在创建该任务时,将is_instant设置为TD_TRUE。否则,如果用户不关心该任务是否完成,建议将is_instant设置为TD_FALSE,这样可以与后续任务组链执行,减少中断次数,提升性能。

  • 查询(query)

    用户根据系统返回的handle,调用ss_mpi_ive_query可以查询对应算子任务是否完成。

  • 及时刷cache

    IVE硬件只能从DDR中获取数据。如果用户在调用IVE任务时,访问空间可cache而且CPU曾经访问,为了保证IVE输入输出数据不被CPU cahce干扰,此时用户需要调用ss_mpi_sys_mmz_flush_cache接口刷cache(详细信息请参见《MPP 媒体处理软件Vx.y 开发参考》),将数据从cache刷到DDR,以供IVE使用。

  • 跨度(stride):与图像或二维数据的width度量一致的量,如图1所示。

    • ot_svp_img图像数据跨度,表示图像一行以“像素”计算的单元个数,“像素”位宽可以是8bit,16bit等。

    • ot_svp_data二维数据跨度,表示二维数据一行的字节数,即为图1中n=8的情况。

    可以将ot_svp_img看成一个“像素”用8bit表示的图像,那么跨度即统一表述为图像或二维数据的一行以“像素”计算的单元个数。

图 1 跨度(stride)示意图

  • 对齐

    硬件为了快速访问内存首地址或者跨行访问数据,要求内存地址或内存跨度必须为对齐系数的倍数。

    • 数据内存首地址对齐

      当前IVE算子对其输入输出有要求1byte对齐、2byte对齐以及16byte对齐的,具体见各算子API参考中的参数要求。

    • 跨度对齐

      对于二维广义图像、二维单分量数据以及一维数组数据的跨度均必须满足16“像素”对齐。

须知: 在使用DDR4时,为提高访存效率,建议首地址使用256字节对齐,stride使用256“像素”的奇数倍对齐。如果是使用64位操作系统,需要使用到的MMZ地址必须是在一个4GB空间内,否则会出现异常。

  • 输入、输出数据类型(具体结构定义请参见“数据类型和数据结构”)

    • 二维广义图像数据

      ot_svp_img、ot_svp_src_img、ot_svp_dst_img,图像的类型参考ot_svp_img_type,具体的内存分配如OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图~OT_SVP_IMG_TYPE_U8C3_PLANAR类型的ot_svp_img图像图所示。

      注意:当前所有算子输入输出的二维广义图像数据的高宽均需为偶数。

    • 二维单分量数据

      ot_svp_data,以byte为单位的二维数据,主要用于dma等,其内存如图11所示;根据类型ot_svp_img可以转化为单个或多个ot_svp_data。

    • 一维数据

      ot_svp_mem_info、ot_svp_src_mem_info、ot_svp_dst_mem_info,表示一维数据,如hist的统计数据、gmm的模型数据、lk_optical_flow的角点输入等;其内存如图12所示。

  • 二维广义图像类型

表 1 二维广义图像类型表1

类型

图像描述

内存地址

跨度

OT_SVP_IMG_TYPE_U8C1

8bit无符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示

仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]

仅用到stride[0]

OT_SVP_IMG_TYPE_S8C1

8bit有符号单通道图像图2所示

仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]

仅用到stride[0]

OT_SVP_IMG_TYPE_YUV420SP

YCbCr420 SemiPlannar数据格式图像,如图3所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0](亮度Y)和phys_addr[1]、virt_addr[1](色度,VU间隔排列);亮度和色度内存可以不连续,但不推荐

跨度仅用到stride[0](亮度跨度)和stride[1](色度跨度)

OT_SVP_IMG_TYPE_YUV422SP

YcbCr422 SemiPlannar数据格式图像,如 OT_SVP_IMG_TYPE_YUV422SP类型的ot_svp_img图像图所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0](亮度Y)和phys_addr[1]、virt_addr[1](色度,VU间隔存储);亮度和色度内存可以不连续,但不推荐

跨度仅用到stride[0](亮度跨度)和stride[1](色度跨度)

OT_SVP_IMG_TYPE_YUV420P

YCbCr420 Planar数据格式图像,如图5所示

内存地址用到ot_svp_img中的phys_addr[0]、virt_addr[0](亮度Y),phys_addr[1]、virt_addr[1](色度U)和phys_addr[2]、virt_addr[2](色度V);Y、U、V内存可不连续,但不推荐

跨度用到stride[0](亮度Y跨度)、stride[1](色度U跨度)和stride[2](色度V跨度)

OT_SVP_IMG_TYPE_YUV422P

YCbCr422 Planar数据格式图像,如图6所示

内存地址用到ot_svp_img中的phys_addr[0]、virt_addr[0](亮度Y),phys_addr[1]、virt_addr[1](色度U)和phys_addr[2]、virt_addr[2](色度V)

跨度用到stride[0](亮度跨度)、stride[1](色度U跨度)和stride[2](色度V跨度)

OT_SVP_IMG_TYPE_S8C2_PACKAGE

8bit有符号双通道且以Package格式存储的图像,如OT_SVP_IMG_TYPE_S8C2_PACKAGE类型的ot_svp_img图像图所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]

跨度仅用到stride[0]

OT_SVP_IMG_TYPE_S8C2_PLANAR

8bit有符号双通道且以Planar格式存储的图像,如OT_SVP_IMG_TYPE_S8C2_PLANAR类型的ot_svp_img图像图所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]和phys_addr[1]、virt_addr[1]

跨度仅用到stride[0]和 stride[1]

OT_SVP_IMG_TYPE_S16C1

16bit有符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]

跨度仅用到stride[0]

OT_SVP_IMG_TYPE_U16C1

16bit无符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]

跨度仅用到stride[0]

OT_SVP_IMG_TYPE_U8C3_PACKAGE

8bit无符号三通道且以Package格式存储的图像,OT_SVP_IMG_TYPE_U8C3_PACKAGE类型的ot_svp_img图像图所示

内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0]

跨度仅用到stride[0]

OT_SVP_IMG_TYPE_U8C3_PLANAR

8bit无符号三通道且以Planar格式存储的图像,OT_SVP_IMG_TYPE_U8C3_PLANAR类型的ot_svp_img图像图所示;

内存地址用到了ot_svp_img中的phys_addr[0]、virt_addr[0],phys_addr[1]、virt_addr[1]和phys_addr[2]、virt_addr[2];

跨度用到了stride[0]、stride[1]和stride[2];

OT_SVP_IAMGE_TYPE_S32C1

32bit有符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示;

内存地址仅用到了ot_svp_img中的phys_addr[0]、virt_addr[0];

跨度仅用到了stride[0];

OT_SVP_IMG_TYPE_U32C1

32bit无符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示;

内存地址仅用到了ot_svp_img中的phys_addr[0]、virt_addr[0];

跨度仅用到了stride[0];

OT_SVP_IMG_TYPE_S64C1

64bit有符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示;

内存地址仅用到了ot_svp_img中的phys_addr[0]、virt_addr[0];

跨度仅用到了stride[0];

OT_SVP_IMG_TYPE_U64C1

64bit无符号单通道图像,如 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像图所示。

内存地址仅用到了ot_svp_img中的phys_addr[0]、virt_addr[0];

跨度仅用到了stride[0];

  • 特殊输出数据类型

    • Integ组合输出(OT_IVE_INTEG_OUT_CTRL_COMBINE)

    • 用OT_SVP_IMG_TYPE_U64C1类型的ot_svp_img,S(图像和)占低28bit,SQ(图像平方和)占高36bit。格式如图 积分图(OT_SVP_IMG_TYPE_U64C1)组合输出示意图所示。

    • 直方图输出如直方图输出格式示意图所示。

图 2 OT_SVP_IMG_TYPE_U8C1 \ OT_SVP_IMG_TYPE_S8C1 \ OT_SVP_IMG_TYPE_S16C1 \ OT_SVP_IMG_TYPE_U16C1 \ OT_SVP_IMG_TYPE_S32C1 \ OT_SVP_IMG_TYPE_U32C1 \ OT_SVP_IMG_TYPE_S64C1 \ OT_SVP_IMG_TYPE_U64C1 类型的ot_svp_img图像

图 3 OT_SVP_IMG_TYPE_YUV420SP类型的ot_svp_img图像

注:格式与ot_pixel_format的OT_PIXEL_FORMAT_YVU_SEMIPLANAR_420对应。

图 4 OT_SVP_IMG_TYPE_YUV422SP类型的ot_svp_img图像

注:

  • 这里V在前,U在后,phys_addr[2]和virt_addr[2]可配置为U的首地址,即phys_addr[1]+1和virt_addr[1]+1。

  • 格式与ot_pixel_format的OT_PIXEL_FORMAT_YVU_SEMIPLANAR_422对应。

图 5 OT_SVP_IMG_TYPE_YUV420P类型的ot_svp_img图像

图 6 OT_SVP_IMG_TYPE_YUV422P类型的ot_svp_img图像

图 7 OT_SVP_IMG_TYPE_S8C2_PACKAGE类型的ot_svp_img图像

图 8 OT_SVP_IMG_TYPE_S8C2_PLANAR类型的ot_svp_img图像

图 9 OT_SVP_IMG_TYPE_U8C3_PACKAGE类型的ot_svp_img图像

注:对于RGB_PACKAGE图像,是以“B0G0R0B1G1R1…”形式存储,B在最前面;

对于HSV_PACKAGE图像,是以“H0S0V0H1S1V1…”形式存储,H在最前面;

对于LAB_PACKAGE图像,是以“L0A0B0L1A1B1…”形式存储,L在最前面。

图 10 OT_SVP_IMG_TYPE_U8C3_PLANAR类型的ot_svp_img图像

注:

对于RGB_PLANAR图像,指针数组virt_addr[3]按顺序分别存储B、G、R的指针,而数组stride[3]分别为B、G、R的跨度;

对于HSV_PLANAR图像,指针数组virt_addr[3]按顺序分别存储H、S、V的指针,而数组stride[3]分别为H、S、V的跨度;

对于LAB_PLANAR图像,指针数组virt_addr[3]按顺序分别存储L、A、B的指针,而数组stride[3]分别为L、A、B的跨度;

图 11 ot_svp_data 类型的数据内存示意

图 12 ot_svp_mem_info 类型的数据内存示意

图 13 积分图(OT_SVP_IMG_TYPE_U64C1)组合输出示意

图 14 直方图输出格式示意

  • 块数据类型

    ot_svp_blob、ot_svp_src_blob、ot_svp_dst_blob,类型参考ot_svp_blob_type,具体的内存分布见《SVPx.0 API参考》中的blob的描述。

使用示意

  • 用户根据需求调用相应的算子接口创建任务,指定is_instant类型,并记录该任务返回的handle号。

  • 根据返回的handle号,指定阻塞方式,可以查询到该任务的完成状态。

    具体可参见ss_mpi_ive_query中的【举例】。

API参考

IVE模块提供了创建任务和查询任务的基本接口。

该功能模块提供以下MPI:

  • ss_mpi_ive_dma:创建直接内存访问任务。

  • ss_mpi_ive_filter:创建5x5模板滤波任务。

  • ss_mpi_ive_csc:创建色彩空间转换任务。

  • ss_mpi_ive_filter_and_csc:创建模板滤波加色彩空间转换复合任务

  • ss_mpi_ive_sobel:创建5x5模板sobel-like梯度计算任务。

  • ss_mpi_ive_mag_and_ang:创建5x5模板计算梯度幅值与幅角任务。

  • ss_mpi_ive_dilate:创建膨胀任务。

  • ss_mpi_ive_erode:创建腐蚀任务。

  • ss_mpi_ive_threshold:创建图像二值化任务。

  • ss_mpi_ive_and:创建两二值图像相与任务。

  • ss_mpi_ive_sub:创建两灰度图像相减任务。

  • ss_mpi_ive_or:创建两二值图像相或任务。

  • ss_mpi_ive_integ:创建积分图统计任务。

  • ss_mpi_ive_hist:创建直方图统计任务。

  • ss_mpi_ive_threshold_s16:创建s16数据到8bit数据阈值化任务。

  • ss_mpi_ive_threshold_u16:创建u16数据到u8数据阈值化任务。

  • ss_mpi_ive_16bit_to_8bit:创建16bit数据到8bit数据线性转化任务。

  • ss_mpi_ive_order_stats_filter:创建3x3模板顺序统计量滤波任务。

  • ss_mpi_ive_map:创建Map(映射u8->u8\u8->u16\u8->s16赋值)任务。

  • ss_mpi_ive_equalize_hist:创建灰度图像的直方图均衡化计算任务。

  • ss_mpi_ive_add:创建两灰度图像的加权加计算任务。

  • ss_mpi_ive_xor:创建两二值图的异或计算任务。

  • ss_mpi_ive_ncc:创建两相同分辨率图像的归一化互相关系数计算任务。

  • ss_mpi_ive_ccl:创建二值图像的连通区域标记任务。

  • ss_mpi_ive_gmm:创建gmm背景建模任务。

  • ss_mpi_ive_gmm2:创建gmm2背景建模任务。

  • ss_mpi_ive_canny_hys_edge:创建灰度图的canny强弱边缘提取任务。

  • ss_mpi_ive_canny_edge:灰度图的canny边缘提取的后半部:连接边缘点,形成canny边缘图。

  • ss_mpi_ive_lbp:创建lbp计算任务。

  • ss_mpi_ive_norm_grad:创建归一化梯度计算任务,梯度均分量均归一化到s8。

  • ss_mpi_ive_lk_optical_flow_pyr:创建多层金字塔LK光流计算任务。

  • ss_mpi_ive_st_cand_corner:灰度图像Shi-Tomasi-like角点计算的前半部:计算候选角点。

  • ss_mpi_ive_st_corner:灰度图像Shi-Tomasi-like角点计算的后半部:按规则挑选角点。

  • ss_mpi_ive_sad:计算两幅图像按4x4\8x8\16x16分块的16 bit\8 bit SAD图像,以及对SAD进行阈值化输出。

  • ss_mpi_ive_resize:创建图像缩放任务。

  • ss_mpi_ive_grad_fg:根据背景图像和当前帧图像的梯度信息计算梯度前景图像。

  • ss_mpi_ive_match_bg_model:基于CodeBook演进的背景模型匹配。

  • ss_mpi_ive_update_bg_model:基于CodeBook演进的背景模型更新。

  • ss_mpi_ive_ann_mlp_load_model:读取ann_mlp模型文件,初始化模型数据。

  • ss_mpi_ive_ann_mlp_unload_model:去初始化ann模型数据。

  • ss_mpi_ive_ann_mlp_predict:创建同一模型多个样本ann_mlp预测任务。

  • ss_mpi_ive_svm_load_model:读取svm模型文件,初始化模型数据。

  • ss_mpi_ive_svm_unload_model:去初始化svm模型数据。

  • ss_mpi_ive_svm_predict:创建同一模型的多个样本svm预测任务。

  • ss_mpi_ive_cnn_load_model:读取cnn模型文件,生成cnn网络模型。

  • ss_mpi_ive_cnn_unload_model:卸载cnn网络模型,释放内存。

  • ss_mpi_ive_cnn_predict:用已有模型对一个或多个输入样本进行预测,并输出预测结果。

  • ss_mpi_ive_cnn_get_result:接收cnn_predict结果,执行softmax运算来预测每个样本图像的类别,并输出置信度最高的类别(rank-1)以及对应的置信度。

  • ss_mpi_ive_persp_trans:根据输入源图的区域位置和点对信息做相应的透视变换。

  • ss_mpi_ive_kcf_get_mem_size:获取需要创建目标对象数的内存大小。

  • ss_mpi_ive_kcf_create_obj_list:创建目标链表。

  • ss_mpi_ive_kcf_destroy_obj_list:销毁目标链表。

  • ss_mpi_ive_kcf_create_gauss_peak:创建高斯峰值。

  • ss_mpi_ive_kcf_create_cos_win:创建汉宁窗。

  • ss_mpi_ive_kcf_get_train_obj:获取需要训练的目标对象。

  • ss_mpi_ive_kcf_proc:提交目标给硬件处理。

  • ss_mpi_ive_kcf_get_obj_bbox:获取目标区域跟踪结果信息。

  • ss_mpi_ive_kcf_judge_obj_bbox_track_state:判断目标区域跟踪状态。

  • ss_mpi_ive_kcf_obj_update:更新目标信息。

  • ss_mpi_ive_hog:计算给定区域的HOG(Histogram of Oriented Gradient)特征。

  • ss_mpi_ive_query:查询已创建任务完成情况。

须知: 用户开辟的内存需要用户保证开辟的内存的正确性,例如ss_mpi_ive_kcf_create_gauss_peak中的gauss_peak的内存由用户开辟,但是随意更改虚拟地址的值就会造成段错误。

ss_mpi_ive_dma

【描述】

创建直接内存访问任务,支持快速拷贝、间隔拷贝、内存填充:可实现数据从一块内存快速拷贝到另一块内存,或者从一块内存有规律的拷贝一些数据到另一块内存,或者对一块内存进行填充操作。

【语法】

td_s32 ss_mpi_ive_dma(ot_ive_handle *handle, const ot_svp_data *src, const ot_svp_dst_data *dst, const ot_ive_dma_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源数据指针。

不能为空。

输入(set模式下同时也是输出)

dst

输出数据指针。

copy模式下不能为空。

输出

ctrl

dma控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

注:

Copy模式是指OT_IVE_DMA_MODE_DIRECT_COPY和OT_IVE_DMA_MODE_INTERVAL_COPY模式;

Set模式是指OT_IVE_DMA_MODE_SET_3BYTE和OT_IVE_DMA_MODE_SET_8BYTE模式。

参数名称

支持类型

地址对齐

分辨率

src

ot_svp_data

1 byte

32x1~4096x4096

dst

ot_svp_dst_data

1 byte

直接拷贝时同src;

间隔拷贝时比src小。

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • OT_IVE_DMA_MODE_DIRECT_COPY:快速拷贝模式。

    可实现从大块内存中扣取小块内存,如图1所示,计算公式如下:

    Iout (x, y) =I (x, y) (0≤x≤width, 0≤y≤height)

    其中I (x, y) 对应src,_I_out (x, y)对应dst。

    图 1 快速拷贝示意图

  • OT_IVE_DMA_MODE_INTERVAL_COPY:间隔拷贝模式

    • 要求源数据宽度为hor_seg_size的倍数;

    • 间隔拷贝的方式:将每ver_seg_rows行中第一行数据分割为hor_seg_size大小的段,拷贝每段中的前elem_size大小的字节。如图2所示。

  • OT_IVE_DMA_MODE_SET_3BYTE:3字节填充模式

    仅使用src,用val的低3字节对源数据进行填充操作;当一行末尾不够3字节时,用val的低字节填充。

  • OT_IVE_DMA_MODE_SET_8BYTE:8字节填充模式

    仅使用src,用val对源数据进行填充操作;当一行的末尾不足8字节时,用val的低字节填充。

    图 2 间隔拷贝示意图

【举例】

无。

【相关主题】

无。

ss_mpi_ive_filter

【描述】

创建5x5模板滤波任务,通过配置不同的模板系数,可以实现不同的滤波。

【语法】

td_s32 ss_mpi_ive_filter(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_filter_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1、YUV420SP、YUV422SP

16 byte

64x64~1920x1024

dst

同src

16 byte

同src

注:U8C1\YUV420SP\YUV422SP均为ot_svp_img_type成员的简写,后续其他的成员在表述中也用相同的规则简写。

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 当源数据为YUV420SP、YUV422SP类型时,要求输出数据跨度一致。

  • filter计算公式示意如图1所示。

图 1 filter计算公式示意图

其中,_I _(x, y)对应src,_I__out _(x, y)对应dst,coef (mask)对应ctrl中的mask[25],norm对应ctrl中的norm。

  • 经典高斯模板如下。

norm =4 norm =8 norm =8

【举例】

无。

【相关主题】

ss_mpi_ive_csc

【描述】

创建色彩空间转换任务,可实现YUV_TO_RGB\YUV_TO_HSV\YUV_TO_LAB\RGB_TO_YUV的色彩空间转换。

【语法】

td_s32 ss_mpi_ive_csc(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_csc_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

YUV420SP、YUV422SP、U8C3_PLANAR、U8C3_PACKAGE

16 byte

16x16~4096x4096

dst

U8C3_PLANAR、U8C3_PACKAGE、YUV420SP、YUV422SP

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 当输出数据为U8C3_PLANAR、YUV420SP、YUV422SP类型时,要求输出数据跨度一致。

  • 支持12种工作模式,不同的模式其输出的取值范围不一样,具体请参见ot_ive_csc_mode。

  • YUV_TO_HSV、YUV_TO_LAB参考OpenCV中的实现方法。

说明: 本文档中所提到的OpenCV,均指OpenCV 2.4.8版本。

【举例】

无。

【相关主题】

ss_mpi_ive_filter_and_csc

ss_mpi_ive_filter_and_csc

【描述】

创建5x5模板滤波和YUV_TO_RGB色彩空间转换复合任务,通过一次创建完成两种功能。

【语法】

td_s32 ss_mpi_ive_filter_and_csc(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_filter_and_csc_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输图像据指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

YUV420SP、YUV422SP

16 byte

64x64~1920x1024

dst

U8C3_PLANAR、U8C3_PACKAGE

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 当输出数据为U8C3_PLANAR类型时,要求输出数据跨度一致。

  • 仅支持YUV_TO_RGB的4种工作模式,具体参见ot_ive_csc_mode。

【举例】

无。

【相关主题】

ss_mpi_ive_filter

ss_mpi_ive_sobel

【描述】

创建5x5模板sobel-like梯度计算任务。

【语法】

td_s32 ss_mpi_ive_sobel(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst_h, const ot_svp_dst_img *dst_v, const ot_ive_sobel_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst_h

由模板直接滤波得到的梯度分量图像H指针。

根据ctrl->out_ctrl,若需要输出则不能为空。

高、宽同src。

输出

dst_v

由转置后的模板滤波得到的梯度分量图像V指针。根据ctrl->out_ctrl,若需要输出则不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

8x8~1920x1024

dst_h

S16C1

16 byte

同src

dst_v

S16C1

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可配置3种输出模式,参考ot_ive_sobel_out_ctrl。

  • 当输出模式为OT_IVE_SOBEL_OUT_CTRL_BOTH时,要求dst_h和dst_v跨度一致。

  • sobel计算公式示意如图1所示。

图 1 sobel计算公式示意图

其中,对应src,对应dst_h,对应dst_v, (mask)为ctrl中的mask[25]

  • sobel模板

  • scharr模板

  • 拉普拉斯模板

【举例】

无。

【相关主题】

ss_mpi_ive_mag_and_ang

【描述】

创建5x5模板梯度幅值与幅角计算任务。

【语法】

td_s32 ss_mpi_ive_mag_and_ang(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst_mag, const ot_svp_dst_img *dst_ang, const ot_ive_mag_and_ang_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst_mag

输出幅值图像指针。

不能为空。

高、宽同src。

输出

dst_ang

输出幅角图像指针。

根据ctrl->out_ctrl,需要输出则不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1024

dst_mag

U16C1

16 byte

同src

dst_ang

U8C1

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可配置2种输出模式,具体参见ot_ive_mag_and_ang_out_ctrl。

  • 当输出模式为OT_IVE_MAG_AND_ANG_OUT_CTRL_MAG_AND_ANG时,要求dst_mag和dst_ang跨度一致。

  • 用户可以通过ctrl->threshold对幅值图进行threshold操作(可以用来实现EOH),计算公式如下:

    其中,对应dst_mag。

图 1 mag_and_ang计算示意图

根据以及取对应上图中0~7的方向值。其中,对应src,对应dst_mag,对应dst_ang,(mask)为ctrl中的mask[25]。

【举例】

无。

【相关主题】

ss_mpi_ive_dilate

【描述】

创建二值图像5x5模板膨胀任务。

【语法】

td_s32 ss_mpi_ive_dilate(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_dilate_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1的二值图

16 byte

64x64~1920x1024

dst

U8C1的二值图

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_ mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 模板系数只能为0或255。

  • 模板样例

图 1 dilate计算公式示意图

其中,公式中|为位或运算,&为位与运算,%为取余运算。对应src,对应dst,(mask)对应ctrl中的mask[25]。

【举例】

无。

【相关主题】

ss_mpi_ive_erode

【描述】

创建二值图像5x5模板腐蚀任务。

【语法】

td_s32 ss_mpi_ive_erode(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_erode_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1的二值图

16 byte

64x64~1920x1024

dst

U8C1的二值图

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 模板系数只能为0或255。

  • 模板样例

图 1 erode计算公式示意图

其中,公式中|为位或运算,&为位与运算,%为取余运算。对应src,对应dst,(mask)对应ctrl中的mask[25]。

【举例】

无。

【相关主题】

ss_mpi_ive_threshold

【描述】

创建灰度图像阈值化任务。

【语法】

td_s32 ss_mpi_ive_threshold(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_threshold_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

1 byte

64x64~1920x1080

dst

U8C1

1 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可以配置8种运算模式,具体参见ot_ive_threshold_mode。

  • 计算公式

    • OT_IVE_THRESHOLD_MODE_BINARY:

      无需赋值。

    • OT_IVE_THRESHOLD_MODE_TRUNC:

      无需赋值。

    • OT_IVE_THRESHOLD_MODE_TO_MINVAL:

      无需赋值。

    • OT_IVE_THRESHOLD_MODE_MIN_MID_MAX:

    • OT_IVE_THRESHOLD_MODE_ORIG_MID_MAX:

      无需赋值。

    • OT_IVE_THRESHOLD_MODE_MIN_MID_ORI:

      无需赋值。

    • OT_IVE_THRESHOLD_MODE_MIN_ORIG_MAX:

      无需赋值。

    • OT_IVE_THRESHOLD_MODE_ORI_MID_ORIG:

      无需赋值。

    其中, 对应src, 对应dst,mode、low_thr、high_thr、min_val、mid_val和max_val分别对应ctrl的mode、low_threshold、high_threshold、min_val、mid_val和max_val。具体示意图如图1所示。

  • ctrl中的min_val、mid_val和max_val并不需要满足变量命名含义中的大小关系。

图 1 threshold 8种阈值化模式示意图

【举例】

无。

【相关主题】

ss_mpi_ive_and

【描述】

创建两二值图像相与任务。

【语法】

td_s32 ss_mpi_ive_and(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_img *dst, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src1

源图像1指针。

不能为空。

输入

src2

源图像2指针。

不能为空。

高、宽同src1。

输入

dst

输出图像指针。

不能为空。

高、宽同src1。

输出

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1的二值图

1 byte

64x64~1920x1080

src2

U8C1的二值图

1 byte

同src1

dst

U8C1的二值图

1 byte

同src1

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

计算公式如下:

其中,对应src1,对应src2,对应dst

【举例】

无。

【相关主题】

ss_mpi_ive_sub

【描述】

创建两灰度图像相减任务。

【语法】

td_s32 ss_mpi_ive_sub(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_img *dst, const ot_ive_sub_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

输出

src1

源图像1指针。

不能为空。

输入

src2

源图像2指针。

不能为空。

高、宽同src1。

输入

dst

输出图像指针。

不能为空。

高、宽同src1。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1

1 byte

64x64~1920x1080

src2

U8C1

1 byte

同src1

dst

U8C1、S8C1

1 byte

同src1

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可以配置2种输出格式,具体参见ot_ive_sub_mode。

  • OT_IVE_SUB_MODE_ABS

    • 计算公式:

    • 输出格式:U8C1

  • OT_IVE_SUB_MODE_SHIFT

    • 计算公式:

    • 输出格式:S8C1

    其中, 对应src1,对应src2,对应dst。

【举例】

无。

【相关主题】

ss_mpi_ive_add

ss_mpi_ive_or

【描述】

创建两二值图像相或任务。

【语法】

td_s32 ss_mpi_ive_or(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_img *dst, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src1

源图像1指针。

不能为空。

输入

src2

源图像2指针。

不能为空。

高、宽同src1。

输入

dst

输出图像指针。

不能为空。

高、宽同src1。

输出

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1

1 byte

64x64~1920x1080

src2

U8C1

1 byte

同src1

dst

U8C1

1 byte

同src1

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

计算公式如下:

其中,对应src1,对应src2, 对应dst。

【举例】

无。

【相关主题】

ss_mpi_ive_integ

【描述】

创建灰度图像的积分图计算任务。

【语法】

td_s32 ss_mpi_ive_integ(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_integ_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

32x16~1920x1080

dst

U32C1、U64C1

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • OT_IVE_INTEG_OUT_CTRL_COMBINE,组合输出模式,输出图像类型必须为OT_SVP_IMG_TYPE_U64C1,参见图13,计算公式如下:

  • OT_IVE_INTEG_OUT_CTRL_SUM,仅和积分图输出模式,输出图像类型必须为OT_SVP_IMG_TYPE_U32C1,计算公式如下:

  • OT_IVE_INTEG_OUT_CTRL_SQRT_SUM,仅平方和积分图输出,输出图像类型必须为OT_SVP_IMG_TYPE_U64C1,计算公式如下:

其中,_ 对应src, _对应dst。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_hist

【描述】

创建灰度图像的直方图统计任务。

【语法】

td_s32 ss_mpi_ive_hist(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_mem_info *dst, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出数据指针。

不能为空。

内存至少配置1024字节,如图14

具体描述请参见《SVPx.0 API 参考》

输出

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1080

dst

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

计算公式如下:

其中,对应src,对应dst。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_threshold_s16

【描述】

创建s16数据到8bit数据的阈值化任务。

【语法】

td_s32 ss_mpi_ive_threshold_s16(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_threshold_s16_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

S16C1

2 byte

64x64~1920x1080

dst

U8C1、S8C1

1 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可配置4种运算模式,参考ot_ive_threshold_s16_mode。

  • 计算公式

    • OT_IVE_THRESHOLD_S16_MODE_S16_TO_S8_MIN_MID_MAX:

      要求:-32768≤≤32767;

      -128≤≤127。

    • OT_IVE_THRESHOLD_S16_MODE_S16_TO_S8_MIN_ORIG_MAX:

      要求:-129≤≤127;

      -128≤≤127;

    • OT_IVE_THRESHOLD_S16_MODE_S16_TO_U8_MIN_MID_MAX:

      要求:-32768≤≤32767;

      0≤≤255。

    • OT_IVE_THRESHOLD_S16_MODE_S16_TO_U8_MIN_ORIG_MAX:

      要求:-1≤≤255;

      0≤≤255。

    其中,对应src,对应dst,mode、low_thr、high_thr、min_val、mid_val和max_val分别对应thrS16Ctrl的mode、low_threshold、high_threshold、min_val、mid_val和max_val。具体示意图如图1所示。

  • ctrl中的min_val、mid_val和max_val并不需要满足变量命名含义中的大小关系。

图 1 threshold_s16 4种阈值化模式示意图

【举例】

无。

【相关主题】

ss_mpi_ive_threshold_u16

【描述】

创建u16数据到u8数据的阈值化任务。

【语法】

td_s32 ss_mpi_ive_threshold_u16(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_threshold_u16_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U16C1

2 byte

64x64~1920x1080

dst

U8C1

1 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可配置2种运算模式,参考ot_ive_threshold_u16_mode。

  • 计算公式

    • OT_IVE_THRESHOLD_U16_MODE_U16_TO_U8_MIN_MID_MAX:

      要求:0≤≤65535;

    • OT_IVE_THRESHOLD_U16_MODE_U16_TO_U8_MIN_ORIG_MAX:

      要求:0≤≤255;

    其中,对应src,对应dst,mode、low_thr、high_thr、min_val、mid_val和max_val分别对应ctrl的mode、low_threshold、high_threshold、min_val、mid_val和max_val。具体示意图如图1所示。

  • ctrl中的min_val、mid_val和max_val并不需要满足变量命名含义中的大小关系。

图 1 threshold_u16 2种阈值化模式示意图

【举例】

无。

【相关主题】

ss_mpi_ive_16bit_to_8bit

【描述】

创建16bit图像数据到8bit图像数据的线性转化任务。

【语法】

td_s32 ss_mpi_ive_16bit_to_8bit(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_16bit_to_8bit_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U16C1、S16C1

2 byte

16x16~1920x1080

dst

U8C1、S8C1

1 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可配置4种模式,具体参考ot_ive_16bit_to_8bit_mode。

  • 计算公式

    • OT_IVE_16BIT_TO_8BIT_MODE_S16_TO_S8:

    • OT_IVE_16BIT_TO_8BIT_MODE_S16_TO_U8_ABS:

    • OT_IVE_16BIT_TO_8BIT_MODE_S16_TO_U8_BIAS:

    • OT_IVE_16BIT_TO_8BIT_MODE_U16_TO_U8:

    其中,对应src,其中,对应dst,mode、分别对应ctrl的mode、num、den、bias。具体示意图如图1所示。

    要求:num ≤ den,且den≠0。

    图 1 16bit_to_8bit 4种转换模式示意图

【举例】

无。

【相关主题】

ss_mpi_ive_order_stats_filter

【描述】

创建3x3模板顺序统计量滤波任务,可进行Median、Max、Min滤波。

【语法】

td_s32 ss_mpi_ive_order_stats_filter(ot_ive_handle *handle, const ot_svp_src_img *src,  const ot_svp_dst_img *dst, const ot_ive_order_stats_filter_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1024

dst

U8C1

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 可配置3种滤波模式,参考ot_ive_order_stats_filter_mode。

  • 计算公式

    • OT_IVE_ORDER_STATS_FILTER_MODE_MEDIAN:

    • OT_IVE_ORDER_STATS_FILTER_MODE_MAX:

    • OT_IVE_ORDER_STATS_FILTER_MODE_MIN:

    其中,对应src, 对应dst。

【举例】

无。

【相关主题】

ss_mpi_ive_map

【描述】

创建map(映射赋值)任务,对源图像中的每个像素,查找map查找表中的值,赋予目标图像相应像素查找表中的值,支持U8C1→U8C1、U8C1→U16C1、U8C1→S16C1 3种模式的映射。

【语法】

td_s32 ss_mpi_ive_map(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_src_mem_info *map, const ot_svp_dst_img *dst, const ot_ive_map_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

map

映射表信息指针。

不能为空。

具体描述请参见《SVPx.0 API 参考》。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16byte

64x64~1920x1080

map

-

16 byte

-

dst

U8C1、U16C1、S16C1

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 计算公式如下:

    其中,对应src, 对应dst,对应map。

  • map的内存配置根据ctrl->mode配置不同:

    • OT_IVE_MAP_MODE_U8,配置sizeof(ot_ive_map_u8bit_lut_mem);

    • OT_IVE_MAP_MODE_U16,配置sizeof(ot_ive_map_u16bit_lut_mem);

    • OT_IVE_MAP_MODE_S16,配置sizeof(ot_ive_map_s16bit_lut_mem).

【举例】

无。

【相关主题】

无。

ss_mpi_ive_equalize_hist

【描述】

创建灰度图像的直方图均衡化计算任务。

【语法】

td_s32 ss_mpi_ive_equalize_hist(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_equalize_hist_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针。

不能为空,申请使用的内存需要是不带cache的。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1080

dst

U8C1

16 byte

同src

ctrl->mem

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • ctrl中的mem,至少需开辟sizeof(ot_ive_equalize_hist_ctrl_mem)字节大小。

  • 与OpenCV中直方图均衡化计算过程一致。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_add

【描述】

创建两灰度图像的加权加计算任务。

【语法】

td_s32 ss_mpi_ive_add(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_img *dst, const ot_ive_add_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src1

源图像1指针。

不能为空。

输入

src2

源图像2指针。

不能为空。

高、宽同src1。

输入

dst

输出图像指针。

高、宽同src1;不能为空。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1

1 byte

64x64~1920x1080

src2

U8C1

1 byte

同src1

dst

U8C1

1 byte

同src1

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

计算公式如下:

其中,对应src1,对应src2,对应dst;x,y为ctrl中的x,y;若定点化前,x和y满足x+y>1,则当计算结果超过8bit取低8bit作为最终结果。

【举例】

无。

【相关主题】

ss_mpi_ive_sub

ss_mpi_ive_xor

【描述】

创建两二值图的异或计算任务。

【语法】

td_s32 ss_mpi_ive_xor(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_img *dst, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src1

源图像1指针。

不能为空。

输入

src2

源图像1指针。

不能为空。

高、宽同src1。

输入

dst

输出图像指针。

不能为空。

高、宽同src1。

输出

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1

1 byte

64x64~1920x1080

src2

U8C1

1 byte

同src1

dst

U8C1

1 byte

同src1

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

计算公式如下:

其中, 对应src1,对应src2,对应dst。

【举例】

无。

【相关主题】

ss_mpi_ive_ncc

【描述】

创建两相同分辨率灰度图像的归一化互相关系数计算任务。

【语法】

td_s32 ss_mpi_ive_ncc(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_mem_info *dst, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src1

源1图像指针。

不能为空。

输入

src2

源2图像指针。

不能为空。

高、宽同src1。

输入

dst

输出数据指针。

不能为空。

内存至少需配置:sizeof (ot_ive_ncc_dst_mem)。

具体描述请参见《SVPx.0 API 参考》

输出

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1

1 byte

32x32~1920x1080

src2

U8C1

1 byte

同src1

dst

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 计算公式如下

  • 仅输出上面公式的分子、开方之前的两个分母项,即num、quad_sum1、quad_sum2,每个变量占64bit,在内存中按照上述顺序依次排布,分别对应上面公式的

【举例】

无。

【相关主题】

无。

ss_mpi_ive_ccl

【描述】

创建二值图像的连通区域标记任务。

【语法】

td_s32 ss_mpi_ive_ccl(ot_ive_handle *handle, const ot_svp_img *src_dst, const ot_svp_dst_mem_info *blob, const ot_ive_ccl_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src_dst

源图像指针,连通区域标记在源图像上进行,即源图像同时也是标记图像输出。

不能为空。

输入、输出

blob

连通区域信息指针。

不能为空。

内存至少需配置为sizeof (ot_ive_ccblob)大小,最多输出254个有效的连通区域。

具体描述请参见《SVPx.0 API 参考》

输出

ctrl

控制参数指针

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src_dst

U8C1

16 byte

16x16~1280x720

支持4连通和8连通

blob

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 连通区域的信息保存在blob->rgn中。

  • blob->info.bits.rgn_num表示有效的连通区域数目,最多254个有效的连通区域;有效的连通区域的面积大于blob->info.cur_area_threshold,标记号为其所在blob->rgn数组元素的下标+1。有效的连通区域并不一定连续地存储在数组中,而很可能是间断的分布在数组中。

  • 若blob->info.label_status为0,则标记成功(一个区域一个标记);若为-1,则标记失败(一个区域多个标记或者多个区域共用一个标记)。对于后者,若用户需要正确的标记号,还需要再次根据blob中的外接矩形信息重新标记。不管标记是否成功,连通区域的外接矩形信息一定是正确可用的。

  • 输出的连通区域会用ctrl->init_area_threshold进行筛选,面积小于等于ctrl->init_area_threshold均会被置为0。

  • 当连通区域数目大于254,会用ctrl->init_area_threshold删除面积小的连通区域;若ctrl->init_area_threshold不满足删除条件,会以ctrl->step为步长,增大删除连通区域的面积阈值。

  • 最终的面积阈值存储在blob->cur_area_threshold中。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_gmm

【描述】

创建GMM背景建模任务,支持灰度图、RGB_PACKAGE图像的GMM背景建模,高斯模型个数为3或者5。

【语法】

td_s32 ss_mpi_ive_gmm(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *fg, const ot_svp_dst_img *bg, const ot_svp_mem_info *model, const ot_ive_gmm_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

fg

前景图像指针。

不能为空。

高、宽同src。

输出

bg

背景图像指针。

不能为空。

高、宽同src。

输出

model

GMM模型参数指针。

不能为空。

具体描述请参见《SVPx.0 API 参考》。

输入、输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • GMM的实现方式参考了OpenCV中的MOG和MOG2。

  • 源图像类型只能为U8C1或U8C3_PACKAGE,分别用于灰度图和RGB图的GMM背景建模。

  • 前景图像是二值图,类型只能为U8C1;背景图像与源图像类型一致。

  • 灰度图像GMM采用n个(n=3 或 5)高斯模型,model的内存排列方式如图1所示。

    图 1 灰度图像GMM模型的内存配置示意图

    一个像素的单个高斯模型参数weight用2字节、mean用2字节、var用3字节;因此model需要分配的内存大小:

    model->size = 7 * src->width * src->height * ctrl->model_num

  • RGB图像GMM采用n个(n=3 或 5})高斯模型,model的内存排列方式如图2所示。

    图 2 RGB图像GMM模型的内存配置示意图

一个像素的单个高斯模型参数weight用2字节、mean[3]用2*3字节、var用3字节;因此model需要分配的内存大小:

model->size = 11 * src->width * src->height * ctrl->model_num

【举例】

无。

【相关主题】

ss_mpi_ive_gmm2

【描述】

创建GMM背景建模任务,支持1-5个高斯模型,支持灰度图和RGB_PACKAGE图输入,支持全局及像素级别的灵敏度系数以及前景模型时长更新系数。

【语法】

td_s32 ss_mpi_ive_gmm2(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_src_img *factor, const ot_svp_dst_img *fg, const ot_svp_dst_img *bg, const ot_svp_dst_img *match_model_info, const ot_svp_mem_info *model, const ot_ive_gmm2_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

factor

模型更新参数指针。

且仅当ctrl-> sns_factor_mode

ctrl-> life_update_factor_mode均使用全局模式时可以为空。

输入

fg

前景图像指针。

不能为空。

高、宽同src。

输出

bg

背景图像指针。

不能为空。

高、宽同src。

输出

match_model_info

模型匹配系数指针。

不能为空。

输出

model

GMM模型参数指针。

不能为空。

具体描述请参见《SVPx.0 API 参考》。

输入、输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1、U8C3_PACKAGE

16 byte

64x64~1280x720

factor

U16C1

16 byte

同src

fg

U8C1的二值图

16 byte

同src

bg

同src

16 byte

同src

match_model_info

U8C1

16 byte

同src

model

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • GMM2在参考了OPENCV的MOG和MOG2的基础上,增加了像素级别的参数控制。

  • 源图像src类型只能为U8C1或U8C3_PACKAGE,分别用于灰度图和RGB图的GMM背景建模。

  • 模型更新参数factor为U16C1图像:每个元素用16 bit表示,低8 bit为灵敏度系数,用于控制模型匹配时方差倍数;高8 bit为前景模型时长更新参数,用于控制背景模型形成时间。

  • 模型匹配系数指针match_model_info为U8C1图像:每个元素用8bit表示,低1 bit为高斯模型匹配标志,0表示匹配失败,1表示匹配成功;高7 bit为频率最大模型序号。

  • GMM2的频率参数(ctrl中的freq_init_val、freq_redu_factor、freq_add_factor freq_threshold)用于控制模型排序和模型有效时间。

    • freq_init_val 越大,模型有效时间越大;

    • freq_redu_factor 越大,模型有效时间越长,模型频率通过乘以频率衰减系数freq_redu_factor /65536,达到频率衰减的目的;

    • freq_add_factor 越大,模型有效时间越长;

    • freq_threshold 越大,模型有效时间越短。

  • GMM2的模型时长参数(ctrl中的life_threshold )用于控制前景模型成为背景的间。

    • life_threshold越大,前景持续时间越长;

    • 单高斯模型下,模型时长参数不生效。

  • 灰度图像GMM2采用n个(1≤n≤5)高斯模型,model的内存排列方式如图1所示。

    图 1 灰度图像GMM2模型的内存配置示意图

    一个像素的单个高斯模型参数mean用2字节,var用2字节,freq用2字节,life用2字节;因此model需要分配的内存大小:

    model->size = 8 * src->width*src->height * ctrl->model_num

  • RGB图像GMM2采用n个(1≤n≤5)高斯模型,model的内存排列方式如图2所示。

    图 2 RGB图像GMM2模型的内存配置示意图

一个像素的单个高斯模型参数mean[3]用6字节,var用2字节,freq用2字节,life用2字节;因此model需要分配的内存大小:

model->size = 12 * src->width*src->height * ctrl->model_num

【举例】

无。

【相关主题】

ss_mpi_ive_canny_hys_edge

【描述】

灰度图的Canny边缘提取的前半部:求梯度、计算梯度幅值幅角、磁滞阈值化及非极大抑制。

【语法】

td_s32 ss_mpi_ive_canny_hys_edge(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *edge, const ot_svp_dst_mem_info *stack, const ot_ive_canny_hys_edge_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

edge

强弱边缘标志图像指针。

不能为空。

高、宽同src。

输出

stack

强边缘点坐标栈。

不能为空。

内存至少配置:

src->width * src->height * (sizeof(ot_svp_point_u16)) + sizeof(ot_ive_canny_stack_size)

具体描述请参见《SVPx.0 API 参考》

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1024

edge

U8C1

16 byte

同src

stack

-

16 byte

-

ctrl->mem

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • edge仅有0、1、2三个取值:

    • 0表示弱边缘点

    • 1表示非边缘点

    • 2表示强边缘点

  • stack中存储强边缘点的坐标信息。

  • ctrl->mem至少需要分配的内存大小

ctrl->mem.size

=(src->width + (16 - src->width % 16) % 16)* 3 * src->height。

  • 该任务完成后,必须要使用ss_mpi_ive_canny_edge函数才能输出Canny边缘图像。

【举例】

无。

【相关主题】

ss_mpi_ive_canny_edge

ss_mpi_ive_canny_edge

【描述】

灰度图的Canny边缘提取的后半部:连接边缘点,形成Canny边缘图。

【语法】

td_s32 ss_mpi_ive_canny_edge(const ot_svp_img *edge, const ot_svp_mem_info *stack);

【参数】

参数名称

描述

输入/输出

edge

作为输入是强弱边缘标志图像指针;作为输出是边缘二值图像指针。

不能为空。

输入、输出

stack

强边缘点坐标栈。

不能为空。

具体描述请参见《SVPx.0 API 参考》

输入、输出

参数名称

支持图像类型

地址对齐

分辨率

edge

U8C1

16 byte

64x64~1920x1024

stack

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

使用该接口前必须调用ss_mpi_ive_canny_hys_edge,在保证ss_mpi_ive_canny_hys_edge任务完成的情况下,使用ss_mpi_ive_canny_hys_edge的输出edge、stack作为该接口的参数输入。

【举例】

无。

【相关主题】

ss_mpi_ive_canny_hys_edge

ss_mpi_ive_lbp

【描述】

创建lbp计算任务。

【语法】

td_s32 ss_mpi_ive_lbp(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst, const ot_ive_lbp_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst

输出图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1024

dst

U8C1

16 byte

64x64~1920x1024

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

LBP计算公式如图1所示。

图 1 lbp计算公式示意图

  • OT_IVE_LBP_COMPARE_MODE_NORMAL

    ,其中 ;

  • OT_IVE_LBP_COMPARE_MODE_ABS

    ,其中 ;

其中,对应src,对应dst,对应ctrl->bit_threshold。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_norm_grad

【描述】

创建归一化梯度计算任务,梯度分量均归一化到s8。

【语法】

td_s32 ss_mpi_ive_norm_grad(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *dst_h, const ot_svp_dst_img *dst_v, const ot_svp_dst_img *dst_hv, const ot_ive_norm_grad_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

dst_h

由模板直接滤波并归一到s8后得到的梯度分量图像(H)指针。

根据ctrl->out_ctrl,若需要输出则不能为空。

输出

dst_v

由转置后的模板滤波并归一到s8后得到的梯度分量图像(V)指针。

根据ctrl->out_ctrl,若需要输出则不能为空。

输出

dst_hv

由模板和转置后的模板直接滤波,并且均归一到s8后,采用package格式存储(如图7)的图像指针。

根据ctrl->out_ctrl,若需要输出则不能为空。

输出

ctrl

控制信息指针。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1920x1024

dst_h

S8C1

16 byte

同src

dst_v

S8C1

16 byte

同src

dst_hv

S8C2_PACKAGE

16 byte

同src

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 控制参数中输出模式如下:

    • OT_IVE_NORM_GRAD_OUT_CTRL_HOR_AND_VER时,dst_h和dst_v指针不能为空,且要求跨度一致;

    • OT_IVE_NORM_GRAD_OUT_CTRL_HOR时,dst_h不能为空;

    • OT_IVE_NORM_GRAD_OUT_CTRL_VER时,dst_v不能为空;

    • OT_IVE_NORM_GRAD_OUT_CTRL_COMBINE时,dst_hv不能为空。

  • norm_grad计算公式如图1所示。

图 1 norm_grad计算公式示意图

【举例】

无。

【相关主题】

ss_mpi_ive_sobel

ss_mpi_ive_lk_optical_flow_pyr

【描述】

创建多层金字塔LK光流计算任务。

【语法】

td_s32 ss_mpi_ive_lk_optical_flow_pyr(ot_ive_handle *handle, const ot_svp_src_img src_prev_pyr[], const  ot_svp_src_img src_next_pyr[],const ot_svp_src_mem_info *prev_points, const ot_svp_mem_info *next_points, const ot_svp_dst_mem_info *status, const ot_svp_dst_mem_info *err, const ot_ive_lk_optical_flow_pyr_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src_prev_pyr[]

前一帧图像的金字塔图像数组,金字塔层数由ctrl-> max_level控制。

不能为空。

输入

src_next_pyr[]

下一帧图像的金字塔图像数组,与src_pre_pyr[]有相同的层数,每层图像大小类型均相同。

不能为空。

输入

prev_points

前一帧图像金字塔第0层(src_prev_pyr[0])的初始特征点数组。

不能为空。

坐标只能为ot_svp_point_s25q7类型;内存至少需分配:ctrl->points_num *sizeof(ot_svp_point_s25q7)。

具体描述请参见《SVPx.0 API 参考》

输入

next_points

特征点prev_pts经过金字塔计算LK光流得到对应于下一帧图像金字塔第0层(src_next_pyr[])的坐标。当ctrl->use_init_flow为true时,需要初始化该特征点数组。

不能为空。

坐标只能为ot_svp_point_s25q7类型;内存至少需分配:ctrl->points_num * sizeof(ot_svp_point_s25q7)。

具体描述请参见《SVPx.0 API 参考》

输入、输出

status

next_pts中每个特征点对应一个td_u8的跟踪状态信息,1表示成功,0表示失败。

具体描述请参见《SVPx.0 API 参考》

输出

err

对next_pts中每个跟踪成功的特征点,对比prev_pts中对应特征点周边进行的相似度误差估计(td_u9q7类型),跟踪失败的特征点不做估计。

具体描述请参见《SVPx.0 API 参考》

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src_prev_pyr[0]

U8C1

16 byte

64x64~1280x720

src_next_pyr[0]

U8C1

16 byte

src_prev_pyr[0]

src_prev_pyr[n]

(金字塔第n层,0≤n≤3)

U8C1

16 byte

64x64~1280x720

src_prev_pyr[0]对应高、宽右移n

src_next_pyr[n]

(金字塔第n层)

U8C1

16 byte

64x64~1280x720

src_prev_pyr[0]对应高、宽右移n

prev_points

-

16byte

-

next_points

-

16byte

-

status

-

16byte

-

err

-

16byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • ctrl-> max_level取值范围[0, 3],对应金字塔层数为[1, 4]。

  • 求解下面的光流方程中,仅用到特征点周围7X7像素的来计算对应的

    其中,分别表示当前图像在x、y方向的偏导,当前图像与前一帧图像的差分。

  • 以3层金字塔LK光流计算为例,要求每层图像的高、宽是上一层图像高、宽的一半,其计算示意图如图1所示。

图 1 3层金字塔LK光流计算示意图

  • 根据输入的特征点坐标,计算出3层金字塔特征点对应的坐标:p0,p1,p2;若需要初始光流,计算出m0,m1,m2;否则m0=p0,m1=p1,m2=p2;

  • 以m2作为输入求出在第2层上的光流终点n2;

  • 计算出n2在第1层的对应坐标n1,以n1作为输入求出第1层上的光流终点q1;

  • 计算出q1在第一层的对应坐标q0,以q0作为输入求出第0层上的光流终点q;

  • 若第0层不是原始图像,根据第0层与原始图像的的比例关系可以得到LK光流的最终点p。

请注意设计和使用限制:每个特征点仅以该特征点为中心固定大小窗口的数据进行计算,若迭代计算过程中,该特征点位移目标点超出该固定大小窗口会导致计算光流失败。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_st_cand_corner

【描述】

灰度图像Shi-Tomasi-like角点计算的前半部:计算候选角点。

【语法】

td_s32 ss_mpi_ive_st_cand_corner(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_dst_img *cand_corner, const ot_ive_st_cand_corner_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源图像指针。

不能为空。

输入

cand_corner

候选角点响应值图像指针。

不能为空。

高、宽同src。

输出

ctrl

控制参数指针。

不能为空。申请使用的内存需要是不带cache的。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

U8C1

16 byte

64x64~1280x720

cand_corner

U8C1

16 byte

同src

ctrl->mem

-

16 byte

-

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 与OpenCV中ShiTomas角点计算原理类似。

  • ctrl->mem至少需开辟的内存大小:

    ctrl->mem.size= 4 * (src->width + (16 - src->width % 16) % 16) * src->height+ sizeof(ot_ive_st_max_eig_val)。

  • 该任务完成后,必须要使用ss_mpi_ive_st_corner函数才能得到真正的角点。

【举例】

无。

【相关主题】

ss_mpi_ive_st_corner

ss_mpi_ive_st_corner

【描述】

灰度图像Shi-Tomasi-like角点计算的后半部:按规则挑选角点。

【语法】

td_s32 ss_mpi_ive_st_corner(const ot_svp_src_img *cand_corner, const ot_svp_dst_mem_info *corner, const ot_ive_st_corner_ctrl *ctrl);

【参数】

参数名称

描述

输入/输出

cand_corner

候选角点响应值图像指针。

不能为空。

输入

corner

角点坐标信息指针。

不能为空。

内存至少需配置:sizeof(ot_ive_st_corner_info)

具体描述请参见《SVPx.0 API 参考》

输出

ctrl

控制参数指针。

不能为空。

输入

参数名称

支持图像类型

地址对齐

分辨率

cand_corner

U8C1

16 byte

64x64~1280x720,最多输出500个角点

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 与OpenCV中ShiTomas角点计算原理类似。

  • corner->corner_num表示最终得到的角点数目。

  • 使用该接口前必须调用ss_mpi_ive_st_cand_corner,在保证ss_mpi_ive_st_cand_corner任务完成的情况下,使用ss_mpi_ive_st_cand_corner的输出cand_corner作为该接口的参数输入。

【举例】

无。

【相关主题】

ss_mpi_ive_st_cand_corner

ss_mpi_ive_sad

【描述】

计算两幅图像按4x4\8x8\16x16分块的16 bit\8 bit SAD图像,以及对SAD进行阈值化输出。

【语法】

td_s32 ss_mpi_ive_sad(ot_ive_handle *handle, const ot_svp_src_img *src1, const ot_svp_src_img *src2, const ot_svp_dst_img *sad, const ot_svp_dst_img *threshold, const ot_ive_sad_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src1

源图像1指针。

不能为空。

输入

src2

源图像2指针。

不能为空。

高、宽同src1。

输入

sad

输出SAD图像指针。

根据ctrl->out_ctrl,若需要输出则不能为空。

根据ctrl->mode,对应 4x4、8x8、16x16分块模式,高、宽分别为src1的1/4、1/8、1/16。

输出

threshold

输出SAD阈值化图像指针。

根据ctrl->out_ctrl,若需要输出则不能为空。

根据ctrl->mode,对应 4x4、8x8、16x16分块模式,高、宽分别为src1的1/4、1/8、1/16。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src1

U8C1

1 byte

64x64~1920x1080

src2

U8C1

1 byte

同src1

sad

U8C1、U16C1

16 byte

根据ctrl->mode,对应 4x4、8x8、16x16分块模式,高、宽分别为src1的1/4、1/8、1/16。

threshold

U8C1

16 byte

根据ctrl->mode,对应 4x4、8x8、16x16分块模式,高、宽分别为src1的1/4、1/8、1/16。

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

计算公式如下:

其中,对应src1,对应src2,对应sad,与ctrl->mode相关,对应OT_IVE_SAD_MODE_MB_4X4、OT_IVE_SAD_MODE_MB_8X8、OT_IVE_SAD_MODE_MB_16X16时分别取4、8、16;

对应thr,Thr、minVal和maxVal分别对应ctrl->threshold、ctrl->min_val和ctrl->max_val。

【举例】

无。

【相关主题】

无。

ss_mpi_ive_resize

【描述】

创建图像缩放任务,支持bilinear、area插值缩放,支持多张U8C1\ U8C3_PLANAR图像同时输入做一种类型的缩放。

【语法】

td_s32 ss_mpi_ive_resize(ot_ive_handle *handle, const ot_svp_src_img src[], const ot_svp_dst_img dst[], const ot_ive_resize_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src[]

源图像数组。

不能为空。

输入

dst[]

输出图像数组。

不能为空。

每张图像类型同src。

输出

ctrl

控制参数指针。

不能为空,申请使用的内存需要是带cache的。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src[]

U8C1、U8C3_PLANAR

16byte

4x4~1920x1080

dst[]

U8C1、U8C3_PLANAR

16 byte

4x4~1920x1080

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 基于OpenCV中resize实现,OT_IVE_RESIZE_MODE_LINEAR、OT_IVE_RESIZE_MODE_AREA分别对应OpenCV resize的INTER_LINEAR、INTER_AREA。

  • 支持U8C1、U8C3_PLANAR混合图像数组输入,但所有图像的缩放模式相同。

  • 最大支持16倍缩放。

  • ctrl->mem内存至少需要25*U8C1_NUM + 49 * (ctrl->num – U8C1_NUM)字节,其中U8C1_NUM为混合图像数组中U8C1图像的数目。

【举例】

无。

【相关主题】

ss_mpi_ive_grad_fg

【描述】

根据背景图像和当前帧图像的梯度信息计算梯度前景图像。

【语法】

td_s32 ss_mpi_ive_grad_fg(ot_ive_handle *handle, const ot_svp_src_img *bg_diff_fg, const ot_svp_src_img *cur_grad, const ot_svp_src_img *bg_grad, const ot_svp_dst_img *grad_fg, const ot_ive_grad_fg_ctrl *ctrl, td_bool is_instant );

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

bg_diff_fg

背景差分前景图像指针。

不能为空。

输入

cur_grad

当前帧梯度图像指针。

不能为空。

高、宽同cur_grad。

输入

bg_grad

背景梯度图像指针。

不能为空。

高、宽同cur_grad。

输入

grad_fg

梯度前景图像指针。

不能为空。

高、宽同cur_grad。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

背景梯度图像和当前梯度图像的类型为S8C2_PACKAGE,水平和竖直方向梯度按照格式存储。

【举例】

无。

【相关主题】

ss_mpi_ive_match_bg_model

【描述】

基于Codebook演进的背景模型匹配。

【语法】

td_s32 ss_mpi_ive_match_bg_model(ot_ive_handle *handle, const ot_svp_src_img *cur_img, const ot_svp_data *bg_model, const ot_svp_img *fg_flag, const ot_svp_dst_img *bg_diff_fg, const ot_svp_dst_img *frm_diff_fg, const ot_svp_dst_mem_info *state_data, const ot_ive_match_bg_model_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

cur_img

当前帧灰度图像指针。

不能为空。

输入

bg_model

背景模型数据指针。

不能为空。

高同cur_img,宽 = cur_img->width * sizeof(ot_ive_bg_model_pixel)。

输入、输出

fg_flag

前景状态图像指针。

不能为空。

高、宽同cur_img。

输入、输出

bg_diff_fg

背景差分前景图像指针。

不能为空。

高、宽同cur_img。

输出

frm_diff_fg

帧间差分前景图像指针;

不能为空。

高、宽同cur_img。

输出

state_data

前景状态数据指针。

不能为空。

内存至少需配置sizeof(ot_ive_fg_status_data)。

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 要求fg_flag、bg_diff_fg、frm_diff_fg跨度一致。

    背景模型数据bg_model中每个像素以ot_ive_bg_model_pixel(24字节)表示,即model->width = sizeof(ot_ive_bg_model_pixel) * src->width,model->height = src->height,至少需要分配内存大小为(sizeof(ot_ive_bg_model_pixel) * src->width + (16 - (sizeof(ot_ive_bg_model_pixel) * src->width % 16) % 16)* model->height。

  • 前景状态图像fg_flag为U8C1类型,其各比特位表示不同的状态信息,单个像素各比特位示意图如图1,按从右到左由低位到高位的顺序排布:

图 1 前景状态标志图形单个像素各比特位示意图

其各个比特位表示的含义如下:

  • 比特位只用到bit0、bit1、bit2、bit5、bit6;其中bit0、bit1、bit2是由本算子计算作为输出,bit5、bit6是由外部函数计算作为输入。

  • bit1为1时表示像素为前景;

  • bit1为1且bit0为1时表示像素为运动前景;

  • bit1为1且bit0为0时表示像素为变化前景;

  • bit2为1时表示像素的背景模型处于工作状态;

  • bit5和bit6表示外部函数对前景状态的反馈,bit5为1时表示前景像素需要短时间保持,bit6为1时表示前景像素需要长时间保持。

【举例】

无。

【相关主题】

ss_mpi_ive_update_bg_model

【描述】

基于Codebook演进的背景模型更新,对背景模型的内部状态进行更新。

【语法】

td_s32 ss_mpi_ive_update_bg_model(ot_ive_handle *handle, const ot_svp_data *bg_model, const ot_svp_img *fg_flag, const ot_svp_dst_img *bg_img, const ot_svp_dst_img *chg_status_img, const ot_svp_dst_img *chg_status_fg, const  ot_svp_dst_img *chg_status_life, const ot_svp_dst_mem_info *state_data, const ot_ive_update_bg_model_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

bg_model

背景模型数据指针。

不能为空。

输入/输出

fg_flag

前景状态图像指针。

不能为空。

输入/输出

bg_img

背景灰度图像指针。

不能为空。

高、宽同fg_flag。

输出

chg_status_img

变化状态灰度图像指针。

当ctrl->det_chg_rgn为0时,可以为空。

高、宽同fg_flag。

输出

chg_status_fg

变化状态前景图像指针。

当ctrl->det_chg_rgn为0时,可以为空。

高、宽同fg_flag。

输出

chg_status_life

变化状态像素的生命时间图像指针。

当ctrl->det_chg_rgn为0时,可以为空。

高、宽同fg_flag。

输出

state_data

背景状态数据指针。

不能为空。

内存至少需配置sizeof(ot_ive_bg_status_data)。

具体描述请参见《SVPx.0 API 参考》

输出

ctrl

控制参数指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 要求fg_flag、bg_img、chg_status_img(不为空时)、chg_status_fg(不为空时)跨度一致。

  • 背景模型数据model参考ss_mpi_ive_match_bg_model中的说明。

  • chg_status_fg表示变化状态前景图像,其中像素非0表示前景,否则表示背景。

  • chg_status_life表示变化状态前景像素的生命时间图像,其像素值表示变化前景的持续时间。

  • 变化状态指像素值发生变化而成为前景,并且变化后的像素值较长时间都保持稳定的状态,这一般是由静止遗留物或者静止移走物在图像中产生。

【举例】

无。

【相关主题】

ss_mpi_ive_ann_mlp_load_model

【描述】

读取ann_mlp模型文件,初始化模型数据。

【语法】

td_s32 ss_mpi_ive_ann_mlp_load_model(const td_char *file_name, ot_ive_ann_mlp_model *model)

【参数】

参数名称

描述

输入/输出

file_name

模型文件路径及文件名。

不能为空。

输入

model

模型数据结构体指针。

不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 文件名必须以.bin为后缀;.bin文件必须用配套工具ive_tool_xml2bin.exe生成。

  • 用户需保证.bin文件的完整性和正确性。

  • 该接口必须和ss_mpi_ive_ann_mlp_unload_model配套使用。

【相关主题】

ss_mpi_ive_ann_mlp_unload_model

【描述】

去初始化ANN模型数据。

【语法】

td_void ss_mpi_ive_ann_mlp_unload_model(const ot_ive_ann_mlp_model *model)

【参数】

参数名称

描述

输入/输出

model

模型数据结构体指针。

不能为空。

输入

【返回值】

返回值

描述

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

该接口必须和ss_mpi_ive_ann_mlp_load_model配套使用。

【举例】

无。

【相关主题】

ss_mpi_ive_ann_mlp_predict

【描述】

创建同一模型多个样本ann_mlp预测任务。

【语法】

td_s32 ss_mpi_ive_ann_mlp_predict(ot_ive_handle *handle, const ot_svp_src_data *src, const ot_svp_lut *actv_func_table, const ot_ive_ann_mlp_model *model, const ot_svp_dst_data *dst, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

输入样本向量(特征向量)数组指针。

不能为空。

宽为样本向量维数 * sizeof(td_s32)。

高为向量个数。

不能为空。

输入

actv_func_table

用于激活函数计算的查找表信息指针。

不能为空。

输入

model

模型数据结构体指针。

不能为空。

输入

dst

预测结果向量数组指针。

宽为类别数 * sizeof(td_s32)。

高为向量个数。

不能为空。

输出

is_instant

及时返回结果标志。

输入

参数名称

支持类型

地址对齐

向量维数

src

一维SQ16.16或者SQ18.14向量数组,每个元素在计算时实际截断到SQ8.16或者SQ10.14计算

16 byte

取值范围:1~1024;

实际值:model->layer_count[0]

dst

一维SQ16.16或者SQ18.14向量数组

16 byte

取值范围:1~256;

实际值:model->layer_cnt[model->layer_num -1]

注:SQ16.16、SQ8.16等定点表示说明参看“定点数据类型”。

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 原理与OpenCV中ann_mlp类似。

  • 激活函数公式

Identity激活函数:

Sigmoid对称激活函数:

  • Gaussian激活函数:

  • 输入样本向量(输入层)维数最大1024维,输出预测结果向量(输出层)维数及各隐藏层神经元个数最大为256。

  • 支持2中数据精度类型,参考ot_ive_ann_mlp_accurate。

  • activ_func_table是用于激活函数计算的查找表,其数据均为S1Q15类型数据,最多4096个;鉴于当前ANN中支持的Identify、Sigmoid、Gaussian激活函数为奇或偶函数,查找表仅对输入 [0, actv_func_table->table_in_upper]建表及查表;对ANN激活函数建立查找表时用于归一化的table_out_norm是表示移位的数目。

  • 以layer_num = 4,layer_cnt[8] = {m0, m1, m2, m3, 0, 0, 0, 0},样本数量 = n,为例:

    • 输入n个样本向量(输入层),每个向量均是包含m0个src_elem类型为SQ16.16或者SQ18.14的向量,实际计算时每个elem截断到SQ8.16或者SQ10.14:

    图 1 ann_mlp输入样本向量数组示意图

    • 输出n个预测结果向量,每个向量均是包含m3个dst_elem类型为SQ16.16或者SQ18.14的向量:

    图 2 ann_mlp输出预测结果示意图

【举例】

无。

【相关主题】

ss_mpi_ive_svm_load_model

【描述】

读取SVM模型文件,初始化模型数据。

【语法】

td_s32 ss_mpi_ive_svm_load_model(const td_char *file_name, ot_ive_svm_model *svm_model);

【参数】

参数名称

描述

输入/输出

file_name

模型文件路径及文件名。

不能为空。

输入

svm_model

模型数据结构体指针。

不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 文件名必须以.bin为后缀;.bin文件必须用配套工具ive_tool_xml2bin.exe生成。

  • 用户必需保证.bin文件的完整性和正确性。

  • 该接口必须和ss_mpi_ive_svm_unload_model配套使用。

【举例】

无。

【相关主题】

ss_mpi_ive_svm_unload_model

【描述】

去初始化SVM模型数据。

【语法】

td_void ss_mpi_ive_svm_unload_model(const ot_ive_svm_model *svm_model);

【参数】

参数名称

描述

输入/输出

svm_model

模型数据结构体指针。

不能为空。

输入

【返回值】

返回值

描述

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

该接口必须和ss_mpi_ive_svm_load_model配套使用。

【举例】

无。

【相关主题】

ss_mpi_ive_svm_predict

【描述】

创建同一模型的多个样本svm预测任务。

【语法】

td_s32 ss_mpi_ive_svm_predict(ot_ive_handle *handle, const ot_svp_src_data *src, const ot_svp_lut *kernel_table, const ot_ive_svm_model *svm_model, const ot_svp_dst_data *dst_vote, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

输入样本向量(特征向量)数组指针。

宽为样本向量维数 * sizeof(td_s16q16)。

高为向量个数。

不能为空。

输入

kernel_table

用于核函数计算的查找表信息指针。

不能为空。

输入

svm_model

模型数据结构体指针。

不能为空。

输入

dst_vote

“1-VS-1 svm”各个类别的投票数向量数组指针。

宽为投票类别数 * sizeof(td_u16)。

高为向量个数。

不能为空。

输出

is_instant

及时返回结果标志。

输入

参数名称

支持类型

地址对齐

向量维数

src

一维SQ16.16向量数组,每个元素用于计算时截断到SQ8.16计算

16 byte

取值范围:1~1024;

实际值:svm_model->feature_dim

dst_vote

一维td_u16向量数组

16 byte

取值范围:1~80;

实际值:svm_model->class_cnt

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 原理与OpenCV中SVM_Predict类似。

  • 核函数计算公式

    线性核函数:

    多项式核函数:

    径向基核函数:

    Sigmoid核函数:

  • 判决函数计算公式:

  • kernel_tab是用于核函数计算的查找表,其数据均为S1Q15类型数据,查找表元素个数参考“解决方案差异”说明;对SVM核函数建立查找表时,查找表的输入是或者,table_out_norm可以表示除法的除数(不能为0,SvmDivisor = table_out_norm)或者移位的数目(可以为0,此时SvmDivisor = 1 << table_out_norm),同样使用工具ive_tool_xml2bin.exe时需要将SvmDivisor作为参数传入,SvmDivisor见ive_tool_xml2bin.exe的使用说明。

  • 以feature_dim = n,class_count = N,样本数量 = r,为例:

    • r个输入样本向量,每个都是SQ16.16类型的n维向量(最大1024维),实际上仅支持SQ8.16,超出部分会截断:

    图 1 svm输入样本向量数组示意图

    • 输出r个预测结果向量,每个均为td_u16类型的N维向量:

    图 2 svm预测结果示意图

【举例】

无。

【相关主题】

ss_mpi_ive_cnn_load_model

【描述】

读取cnn模型文件,初始化cnn模型数据。

【语法】

td_s32 ss_mpi_ive_cnn_load_model(const td_char *file_name, ot_ive_cnn_model *model );

【参数】

参数名称

描述

输入/输出

file_name

模型文件路径及文件名。

不能为空。

输入

model

cnn网络模型结构体指针。

不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 文件名必须以.bin为后缀;.bin文件必须用配套工具ive_tool_caffe(参考《IVE 工具使用指南》)生成。

  • 用户必需保证.bin文件的完整性和正确性。

  • 该接口必须和ss_mpi_ive_cnn_unload_model配套使用。

【举例】

无。

【相关主题】

ss_mpi_ive_cnn_unload_model

【描述】

去初始化cnn模型数据。

【语法】

td_void ss_mpi_ive_cnn_unload_model(const ot_ive_cnn_model *model);

【参数】

参数名称

描述

输入/输出

model

cnn网络模型结构体指针。

不能为空。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

该接口必须和ss_mpi_ive_cnn_load_model配套使用。

【举例】

无。

【相关主题】

ss_mpi_ive_cnn_predict

【描述】

创建一个CNN模型的单个或多个样本预测任务,并输出特征向量。

【语法】

td_s32 ss_mpi_ive_cnn_predict(ot_ive_handle *handle, const ot_svp_src_img src[], const ot_ive_cnn_model *model, const ot_svp_dst_data *dst, const ot_ive_cnn_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src[]

输入样本图像数组。最多64张样本图像。

不能为空。

输入

model

cnn模型结构体指针。

不能为空。

输入

dst

特征向量数组指针,存放cnn全连接最后一层结果。

不能为空。

输出

ctrl

控制参数指针。

ctrl->mem内存分配见【注意】。

不能为空。

输入

is_instant

及时返回结果标志

输入

参数名称

支持类型

地址对齐

分辨率

src[]

U8C1、U8C3_PLANAR

16 byte

宽w:16~80;

高h:16~1280/w

参数名称

向量个数

地址对齐

向量描述

dst

取值范围:1~64

实际值:dst->height

16 byte

维数取值范围:1~256;

维数实际值:model-> fc_info. layer_cnt [model-> fc_info. layer_num-1]

元素类型:SQ18.14

注:SQ18.14定点表示说明参看“定点数据类型”。

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 若训练时对数据做了预处理(如减去均值),则需要输入数据在调用该接口前做同样的数据预处理(调用接口前减去均值)。

  • 训练要求对数据做[0, 255]到[0, 1]的归一化,即训练的.prototxt中对原始数据必须有“transform_param{scale: 0.00390625}”;在调用该接口预测时不需要做归一化,硬件内部会自动处理。

  • ctrl->mem内存分配至少需分配:

    ive_align(m * ctrl->num * sizeof(td_u32), 16) + ive_align(model->fc_info.layer_cnt[0]* sizeof(td_u32), 16)* ctrl->num,

    其中,model->type为U8C1时,m=1;为U8C3_PLANAR时,m=3。

  • 样本数组src[]的图像类型、宽、高必须与CNN网络模型中model中的type、width、height一致,数组元素个数为ctrl-> num。

  • 特征向量数组dst的向量数目dst->height与图像数目ctrl->num相等。

    输出的特征向量内存如图1所示,每个向量维数dim = model-> fc_info. layer_cnt [model-> fc_info. layer_num-1],向量的元素elem类型为SQ18.14,向量个数height=ctrl->num。

    图 1 cnn输出特征向量数组示意图

  • 该接口和ss_mpi_ive_cnn_get_result配套使用,特征向量数组dst是ss_mpi_ive_cnn_get_result的输入。

  • CNN网络模型支持最多8层Conv-ReLU-Pooling和8层全连接层;Conv-ReLU-Pooling层的卷积核仅支持3x3,ReLU(Rectified Linear Units)和Pooling可配(见ot_ive_cnn_actv_func和ot_ive_cnn_pooling),每层Conv-ReLU-Pooling最多输出50张feature map;全连接层仅支持ReLU激活函数,层数范围[3, 8]:全连接输入层(即Conv-ReLU-Pooling的最终输出)维数[1, 1024],中间隐藏层神经元数目[2,256],输出层维数[1, 256]。具体参数配置参见下列表格:

表 1 cnn模型中单层Conv-ReLU-Pooling运算包参数配置表

Conv-ReLU-Pooling 运算包

模式

数量

大小

步长

边界填充

Convolution

-

1-50

3x3

1

-

Activation

None\ReLU

-

-

-

-

Pooling

None\Max\

Average

-

2x2

2

向上取偶数对齐,复制边界。

表 2 cnn模型中全连接运算包参数配置表

层数(含输入层)

输入层维数

中间隐藏层节点数

输出层维数

隐藏层激活函数

3-8

1-1024

2-256

1-256

ReLU

  • 以单个输入样本,n+1(1≤n+1≤8)层Conv-ReLU-Pooling和m+1(3≤m+1≤8)层全连接层为例,CNN网络模型如图2所示。注意图示中,FCL-0是Pooling-n各图像数据拉成的列向量,实际计算过程中Pooling-n的结果会直接以FCL-0的形式输出。

    图 2 cnn网络模型示意图

【举例】

无。

【相关主题】

ss_mpi_ive_cnn_get_result

【描述】

接收cnn_predict结果,执行softmax运算来预测每个样本图像的类别,并输出置信度最高的类别(Rank-1)以及对应的置信度。

【语法】

td_s32 ss_mpi_ive_cnn_get_result(const ot_svp_src_data *src, const ot_svp_dst_mem_info *dst, const ot_ive_cnn_model *model, const ot_ive_cnn_ctrl *ctrl);

【参数】

参数名称

描述

输入/输出

src

源数据指针。源数据为ss_mpi_ive_cnn_predict的输出。不能为空。

输入

dst

预测结果结构体指针,指向ot_ive_cnn_result的数组,表示各个样本的类别和置信度。

不能为空。

具体描述请参见《SVPx.0 API 参考》

输出

model

CNN模型结构体指针。

不能为空。

输入

ctrl

控制参数指针。不能为空。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【解决方案差异】

解决方案名称

差异

SS928V100

不支持

SS927V100

不支持

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 源数据src必须为ss_mpi_ive_cnn_predict的输出,model和ctrl必须与调用时的参数一致。

  • 预测结果dst指向ot_ive_cnn_result的数组,数组元素数目n=ctrl->num,其内存排布如图1所示。

图 1 cnn各样本预测结果示意图

  • 该接口实现的rank-1版本,用户可根据自己的需求实现rank-n(表示最可能的n类)版本,步骤如下:

    1. 通过softmax计算出每个类别的置信度;

    2. 对置信度进行排序;

    3. 输出rank-n的结果。

【举例】

无。

【相关主题】

ss_mpi_ive_persp_trans

【描述】

根据输入源图的区域位置和点对信息做相应的透视变换。

【语法】

td_s32 ss_mpi_ive_persp_trans(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_rect_u16 roi[], const ot_svp_src_mem_info point_pair[], const ot_svp_dst_img dst[], const ot_ive_persp_trans_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源数据指针。不能为空。

输入

roi[]

源图区域信息。

取值范围:

  • 宽:[20, 1024]
  • 高:[20, 1024]

不能为空。

输入

point_pair[]

做透视变换的点对信息。

不能为空。

具体描述请参见《SVPx.0 API 参考》

输入

dst[]

经过透视变换之后的结果信息。

不能为空。

输出

ctrl

控制信息指针。

不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

OT_SVP_IMG_TYPE_U8C1/ OT_SVP_IMG_TYPE_YUV420SP

16 byte

20x20~1920x1080

dst[]

OT_SVP_IMG_TYPE_U8C1/ OT_SVP_IMG_TYPE_YUV420SP/

OT_SVP_IMG_TYPE_U8C3_PACKAGE

16 byte

20x20~256x256

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 所有区域的透视变换算法模式相同。

  • 点对point_pair在内存的排布格式:

    SrcX_PPN为第N个点对源X坐标,SrcY_PPN为第N个点对源Y坐标,DstX_PPN为第N个点对目的X坐标,DstY_PPN为第N个点对目的Y坐标。坐标都是用u14q2表示。

  • 算法原理描述:

    仿射变换是投影变换的一种特殊形式,从数学的角度看,仿射变换就是向量经过一次线性变换加一次平移变换,用公式可以表示为:

    其中,为变换前原始向量,为变换后目标向量,A为线性变换矩阵,为平移变换向量。公式可以统一描述成下面的矩阵的形式以方便计算和理解:

    在图像处理中,向量就是二维坐标(x, y),所以上面的矩阵可以改写成下面的坐标表达形式:

    对于一幅图像,如果我们知道变换矩阵T,便可对图像中任何一点进行仿射变换。由于T是一个3x3的矩阵,要求解该矩阵需要至少三组已知点对。根据不同的变换矩阵系数的组合,图像几何矫正就是在各种选定的图像变换(例如平移,缩放,旋转,斜切和透视等,如图1所示)方式下,利用标定的原图像和目标图像的基准点对,求解得到变换矩阵,然后用该变换矩阵对源图像做变化得到矫正后的目标图像:

    图 1 图像变换

    图像透视变换应用广泛,下面以_图像分析_中的人脸矫正为例进行说明。典型的_图像分析_应用如图2所示,首先利用人脸的关键点检测算法将人脸的关键点Landmark(LMK)检测出来,不同的关键点检测算法检测到的关键点的个数各异,persp_trans算子支持最大68个关键点基准点对,通过人脸的关键点点对,建立超定线性方程并求解得到变换矩阵,将检测到的人脸几何矫正后裁剪到标准图像大小。

    图 2 _图像分析_应用

    本算子目前支持的变换方式包括平移、缩放、旋转和斜切,求解得到的变换矩阵系数是这些变换方式的融合,变换矩阵各参数对应的变换模式的物理意义分解如图3所示。

    图 3 变换矩阵各参数对应的变换模式

    图4给出一个具体的利用5个基准点对,眼睛(2)、鼻子(1)、嘴(2)用例,利用图示的点对,求解得到图示的变换矩阵,将250x250的人脸图像变换到标准图像库96x112分辨率的图像进行_图像分析_。

    图 4 人脸图像变换

【举例】

【相关主题】

ss_mpi_ive_kcf_get_mem_size

【描述】

获取需要创建目标对象数的内存大小。

【语法】

td_s32 ss_mpi_ive_kcf_get_mem_size(td_u32 max_obj_num, td_u32 *size);

【参数】

参数名称

描述

输入/输出

max_obj_num

最大目标对象数。取值范围:[1, 64]

输入

size

内存大小指针。不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

申请通过本接口获取到的内存大小的内存,作为ss_mpi_ive_kcf_create_obj_list接口输入来创建目标链表。

【举例】

【相关主题】

ss_mpi_ive_kcf_create_obj_list

ss_mpi_ive_kcf_create_obj_list

【描述】

创建目标链表。

【语法】

td_s32 ss_mpi_ive_kcf_create_obj_list(const ot_svp_mem_info *mem, td_u32 max_obj_num, ot_ive_kcf_obj_list *obj_list);

【参数】

参数名称

描述

输入/输出

mem

创建目标链表内存指针。不能为空。

具体描述请参见《SVPx.0 API 参考》

输入

max_obj_num

最大目标数。取值范围:[1, 64]

输入

obj_list

目标链表指针。不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 创建的目标链表只能是单线程访问。

  • 多线程做跟踪不同目标,需要每个线程单独创建一个目标链表。

  • obj_list只能通过调用接口操作,不能通过其他方式操作。

  • 必须使用ss_mpi_ive_kcf_destroy_obj_list进行销毁,否则会造成内存泄露。

  • max_obj_num必须和ss_mpi_ive_kcf_get_mem_size接口的max_obj_num保持一致。

  • 如果需要多线程操作obj_list,则需要用户保证obj_list操作的同步和正确性。

  • mem管理的内存和obj_list是一一对应关系,不能对应多个obj_list,否则会出现异常。

【举例】

【相关主题】

ss_mpi_ive_kcf_destroy_obj_list

【描述】

销毁目标链表。

【语法】

td_s32 ss_mpi_ive_kcf_destroy_obj_list(ot_ive_kcf_obj_list *obj_list);

【参数】

参数名称

描述

输入/输出

obj_list

目标链表指针。不能为空。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

【举例】

【相关主题】

ss_mpi_ive_kcf_create_gauss_peak

【描述】

创建高斯峰值。

【语法】

td_s32 ss_mpi_ive_kcf_create_gauss_peak(td_u3q5 padding, const ot_svp_dst_mem_info *gauss_peak );

【参数】

参数名称

描述

输入/输出

padding

目标区域放大倍数。取值范围:[48, 160]

输入

gauss_peak

高斯峰值表指针。不能为空。

注意:至少需要申请455680字节的内存大小。

具体描述请参见《SVPx.0 API 参考》

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • gauss_peak 需要用户申请内存。

  • 创建高斯峰值接口只需要执行一次。

  • 确保一个padding对应一个gauss_peak。如果需要多个padding,则需要多个gauss_peak。

【举例】

【相关主题】

ss_mpi_ive_kcf_create_cos_win

【描述】

创建汉宁窗。

【语法】

td_s32 ss_mpi_ive_kcf_create_cos_win(const ot_svp_dst_mem_info *cos_win_x, const ot_svp_dst_mem_info *cos_win_y)

【参数】

参数名称

描述

输入/输出

cos_win_x

水平方向汉宁窗指针。不能为空。

注意:至少需要申请832字节的内存大小。

具体描述请参见《SVPx.0 API 参考》

输出

cos_win_y

垂直方向汉宁窗指针。不能为空。

注意:至少需要申请832字节的内存大小。

具体描述请参见《SVPx.0 API 参考》

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • cos_win_x,cos_win_y需要用户申请内存。

  • 创建汉宁窗接口只需要执行一次。

【举例】

【相关主题】

ss_mpi_ive_kcf_get_train_obj

【描述】

获取需要训练的目标对象。

【语法】

td_s32 ss_mpi_ive_kcf_get_train_obj(td_u3q5 padding, const ot_ive_roi_info roi_info[], td_u32 obj_num, const ot_svp_mem_info *cos_win_x, const ot_svp_mem_info *cos_win_y, const ot_svp_mem_info *gauss_peak, ot_ive_kcf_obj_list *obj_list);

【参数】

参数名称

描述

输入/输出

padding

目标区域放大倍数。取值范围:[48, 160]

输入

roi_info[]

目标区域信息

输入

obj_num

目标区域数目

输入

cos_win_x

水平方向汉宁窗指针。不能为空。

具体描述请参见《SVPx.0 API 参考》

输入

cos_win_y

垂直方向汉宁窗指针。不能为空。

具体描述请参见《SVPx.0 API 参考》

输入

gauss_peak

高斯峰值表指针。不能为空。

具体描述请参见《SVPx.0 API 参考》

输入

obj_list

目标对象链表指针。不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 本接口依赖ss_mpi_ive_kcf_create_obj_list、ss_mpi_ive_kcf_create_gauss_peak、ss_mpi_ive_kcf_create_cos_win等接口创建的信息。

  • roi_info的roi区域与padding需要满足下面的约束关系:

    • width * padding / 32 必须小于等于1024,大于等于40;

    • height * padding / 32 必须小于等于1024,大于等于40。

    • width、height取值范围为[8,684]。

  • 使用本接口前必须确保以下三个接口调用来初始化参数cos_win_x、cos_win_y、gauss_peak和obj_list。

【举例】

【相关主题】

ss_mpi_ive_kcf_proc

【描述】

提交目标给硬件处理。

【语法】

td_s32 ss_mpi_ive_kcf_proc(ot_ive_handle *handle, const ot_svp_src_img *src, ot_ive_kcf_obj_list *obj_list, const ot_ive_kcf_proc_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源数据指针。不能为空。

输入

obj_list

目标链表指针。不能为空。

输入

ctrl

控制指针。不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

OT_SVP_IMG_TYPE_YUV420SP

16 byte

176x144~1920x1080

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 调用本接口前必须确保至少调用一次ss_mpi_ive_kcf_get_train_obj获取到要训练的对象。

  • 软件调用流程如图1所示,具体代码示例请参考sample实现。

    图 1 KCF软件调用流程

  • 算法描述如下:

    KCF算法利用循环矩阵对角化等性质,将跟踪问题核化,使核化后跟踪比对的操作简化成易于并行加速的矩阵运算,提升跟踪解决方案的系统性能,KCF算法可以和HOG算子联合使用,典型的算法用例如图2所示。

    图 2 KCF典型的算法用例

跟踪问题核化、相关滤波器训练等数学推导参阅“High-speed tracking with kernelized correlation filters”,IEEE Trans. PAMI, vol.37, No. 3, March 2015.

算法的总体流程:在It帧中,在当前位置pt附近采样,训练一个回归器。来计算一个小窗口采样的响应。在It+1帧中,在前一帧位置pt附近采样,用已经训练的回归器来判断每个采样的响应。响应最强的采样作为本帧的位置pt+1。

用一个人脸跟踪图解一下上面的跟踪算法过程,如图3所示,首先对初始帧做初始化,框定一个待跟踪的ROI,对输入图像做特征提取用余弦函数窗对提取到的特征加权后, 将其用FFT变换到频域,与训练得到的相关滤波器在频域做点乘,反变换到空域后找到最强的响应位置,就是得到人脸在当前帧的预测。

图 3 跟踪算法过程示例

图3的相关滤波器参数训练问题通过核函数和循环矩阵对角化的性质简化为矩阵运算操作,详细数学推导参阅上面里出的参考论文。

【举例】

【相关主题】

ss_mpi_ive_kcf_get_obj_bbox

【描述】

获取目标区域跟踪结果信息。

【语法】

td_s32 ss_mpi_ive_kcf_get_obj_bbox(ot_ive_kcf_obj_list *obj_list, ot_ive_kcf_bbox bbox[], td_u32 *bbox_obj_num, const ot_ive_kcf_bbox_ctrl *ctrl);

【参数】

参数名称

描述

输入/输出

obj_list

目标链表指针。不能为空。

输入

bbox[]

目标区域跟踪结果信息。

输出

bbox_obj_num

目标区域跟踪结果数目指针。不能为空。

输出

ctrl

控制指针,不能为空。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

【举例】

【相关主题】

ss_mpi_ive_kcf_judge_obj_bbox_track_state

【描述】

判断目标区域跟踪状态。

【语法】

td_s32 ss_mpi_ive_kcf_judge_obj_bbox_track_state(const ot_ive_roi_info *roi_info, const ot_ive_kcf_bbox *bbox, td_bool *is_track_ok);

【参数】

参数名称

描述

输入/输出

roi_info

目标区域信息指针。不能为空。

输入

bbox

目标区域跟踪结果信息指针。

输入

is_track_ok

目标区域跟踪状态标志指针。不能为空。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

当新检测的目标区域与跟踪的目标区域是同一个目标时,本接口可以利用新检测目标区域信息来判断正在跟踪的目标区域是否已经跟踪失败。

【举例】

【相关主题】

ss_mpi_ive_kcf_obj_update

【描述】

更新目标信息。

【语法】

td_s32 ss_mpi_ive_kcf_obj_update(ot_ive_kcf_obj_list *obj_list, const ot_ive_kcf_bbox bbox[], td_u32 bbox_obj_num);

【参数】

参数名称

描述

输入/输出

obj_list

目标链表指针。不能为空。

输入

bbox

目标区域跟踪结果信息。

输入

obj_num

目标区域跟踪结果数目。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

【举例】

【相关主题】

ss_mpi_ive_hog

【描述】

计算给定区域的HOG(Histogram of Oriented Gradient)特征。

【语法】

td_s32 ss_mpi_ive_hog(ot_ive_handle *handle, const ot_svp_src_img *src, const ot_svp_rect_u16 roi[],const ot_svp_dst_blob dst[], const ot_ive_hog_ctrl *ctrl, td_bool is_instant);

【参数】

参数名称

描述

输入/输出

handle

handle指针。

不能为空。

输出

src

源数据指针。不能为空。

输入

roi[]

目标区域。

取值范围:

  • 宽:[64,1024]
  • 高:[64,1024]

ROI必须在图像内。

输入

dst[]

HOG特征。

具体描述请参见《SVPx.0 API 参考》

输出

ctrl

控制指针。不能为空。

输入

is_instant

及时返回结果标志。

输入

参数名称

支持图像类型

地址对齐

分辨率

src

OT_SVP_IMG_TYPE_YUV420SP

16 byte

176x144~1920x1080

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • HOG特征存储格式:

    图1所示,HOG特征是由一个三维空间来存储:

    • C表示特征的channel(固定为31)

    • W表示特征的width

    • H表示特征的height,每个HOG特征需要2byte存储空间

  • HOG特征的W/H 的计算公式如下:

    假设ROI区域宽为RectW,高为RectH。则

    W = min(136, RectW) / 4 – 2;

    H = min(136, RectH) / 4 – 2;

图 1 HOG特征的存储结构

存储格式分别是垂直切面和水平切面两个格式。图2表示垂直切面格式。图3表示水平切面格式。

图 2 HOG特征垂直切面存储格式

垂直切面存储格式时,Stride是W做16byte对齐,需要分配的内存大小为2 * Stride * H*C

图 3 HOG特征水平切面存储格式

水平切面存储格式时,Stride是C (固定为31) 做16byte对齐,需要分配的内存大小为Stride * 2 * W * H。

  • ROI区域的宽度和高度必须在[64, 1024]范围内,而且是8的倍数。

  • HOG特征通过ot_svp_blob结构描述(具体请见《SVPx.0 API参考》1.4小节描述),类型为OT_SVP_BLOB_TYPE_U16,存储格式按照HOG特征描述的格式存储。

  • 算法描述如下:

HOG是Histogram of Oriented Gridients的缩写为 HOG,是目前计算机视觉、模式识别领域很常用的一种描述图像局部纹理的特征,整体计算处理流程如图4所示。

图 4 HOG计算流程

梯度计算可以有多种方法,IVE首先计算图像每个像素各颜色分量的水平梯度

和垂直梯度

其中为图像的像素值,计算每个像素点处各颜色分量的梯度幅值:

每个图像像素的梯度幅值:

梯度方向:

本HOG算子把图像分成若干个cells,每个cell按照360度划分为9个bin(即9维特征向量),如图5所示。

图 5 每个cell划分bin的角度范围

【举例】

【相关主题】

ss_mpi_ive_query

【描述】

查询已创建任务完成情况。

【语法】

td_s32  ss_mpi_ive_query(ot_ive_handle handle, td_bool *is_finish, td_bool is_block) ;

【参数】

参数名称

描述

输入/输出

handle

任务的handle。

取值范围:(-1, 0x0FFFFFFF)

输入

is_finish

任务完成状态指针。

不能为空。

输出

is_block

是否阻塞查询标志。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【需求】

  • 头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h

  • 库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)

【注意】

  • 输入handle必须为调用的算子函数返回的handle。

  • 在用户使用IVE任务结果前,为确保IVE任务已完成,用户可以使用阻塞方式调用此接口查询。

  • IVE内部是按任务创建顺序依次执行任务的,所以用户不必每次都使用查询接口,如用户依次创建了A,B两个任务,那么如果B任务完成了,这个时候A任务肯定也完成了,此时使用A任务的结果时不必再次调用查询接口。

  • 返回值为OT_ERR_IVE_QUERY_TIMEOUT(查询超时)时,可以继续查询。

  • 返回值为OT_ERR_IVE_SYS_TIMEOUT(系统超时)时,用户的IVE任务必须全部重新提交。

【举例】

td_s32 ret = TD_SUCCESS;
ot_ive_handle handle;
ot_svp_src_data src;
ot_svp_dst_data dst;
ot_ive_dma_ctrl  ctrl = {OT_IVE_DMA_MODE_DIRECT_COPY, 0};
td_bool is_instant;
td_bool is_finish, is_block;
    
src.phys_addr           = 0;
src.vir_addr                = 0;
src.stride           = 352;    
src.height                   = 288;
src.width            = 352;
 
dst.phys_addr           = 0;
dst.vir_addr                = 0;
dst.stride                    = 352;    
dst.height                   = 288;
dst.width            = 352;
 
is_instant                     = TD_TRUE;
ret = ss_mpi_sys_mmz_alloc_cached(&src.phys_addr, 
&((td_void*)(td_uintptr_t)src.virt_addr), "User", TD_NULL, src.height  
 * src.stride);
if (ret != TD_SUCCESS) {
return ret;
}
memset((td_void*)(td_uintptr_t)src.virt_addr, 1, src.height * src.stride);
 
ret = ss_mpi_sys_mmz_alloc_cached(&dst.phys_addr, 
         &((td_void*)(td_uintptr_t)dst.virt_addr), "User", TD_NULL, 
         dst.height * dst.stride);
if(ret != TD_SUCCESS) {
ss_mpi_sys_mmz_free(src.phys_addr, 
         (td_void*)(td_uintptr_t)src.virt_addr));
return ret;
}
memset((td_void*)(td_uintptr_t)dst.virt_addr, 0, dst.height * dst.stride);
ret = ss_mpi_sys_mmz_flush_cache(0, NULL, 0);
if(ret != TD_SUCCESS) {
ss_mpi_sys_mmz_free(src.phys_addr, 
         ((td_void*)(td_uintptr_t)src.virt_addr));
ss_mpi_sys_mmz_free(dst.phys_addr, 
         ((td_void*)(td_uintptr_t)dst.virt_addr));
    return ret;
}
ret = ss_mpi_ive_dma(&handle, &src, &dst, &ctrl, is_instant);
if(ret != TD_SUCCESS) {
ss_mpi_sys_mmz_free(src.phys_addr, 
         ((td_void*)(td_uintptr_t)src.virt_addr));
ss_mpi_sys_mmz_free(dst.phys_addr, 
         ((td_void*)(td_uintptr_t)dst.virt_addr));
    return ret;
}
is_block = TD_FALSE;
ret = ss_mpi_ive_query(handle, &is_finish, is_block);
if (ret == TD_SUCCESS) {
printf("is_finish=%d\n", is_Finish);
}
ss_mpi_sys_mmz_free(src.phys_addr, ((td_void*)(td_uintptr_t)src.virt_addr));
ss_mpi_sys_mmz_free(dst.phys_addr, ((td_void*)(td_uintptr_t)dst.virt_addr));
return ret;

【相关主题】

无。