前言¶
本文档为使用媒体处理芯片的IVE协处理器进行识别分析方案开发的程序员而写,目的是供您在开发过程中查阅IVE协处理器支持的各种参考信息,包括API、头文件、错误码、Proc信息等。
说明: 本文未有特殊说明,SS927V100与SS928V100内容完全一致。
与本文档相对应的产品版本如下。
本文档(本指南)主要适用于以下工程师:
技术支持工程师
软件开发工程师
在本文中可能出现下列标志,它们所代表的含义如下。
概述¶
概述¶
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表示的图像,那么跨度即统一表述为图像或二维数据的一行以“像素”计算的单元个数。
对齐
硬件为了快速访问内存首地址或者跨行访问数据,要求内存地址或内存跨度必须为对齐系数的倍数。
数据内存首地址对齐
当前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
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图像图所示 |
|||
8bit有符号单通道图像,如图2所示 |
|||
YCbCr420 SemiPlannar数据格式图像,如图3所示 |
内存地址仅用到ot_svp_img中的phys_addr[0]、virt_addr[0](亮度Y)和phys_addr[1]、virt_addr[1](色度,VU间隔排列);亮度和色度内存可以不连续,但不推荐 |
||
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间隔存储);亮度和色度内存可以不连续,但不推荐 |
||
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内存可不连续,但不推荐 |
||
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) |
||
8bit有符号双通道且以Package格式存储的图像,如OT_SVP_IMG_TYPE_S8C2_PACKAGE类型的ot_svp_img图像图所示 |
|||
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] |
||
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图像图所示 |
|||
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图像图所示 |
|||
8bit无符号三通道且以Package格式存储的图像,如OT_SVP_IMG_TYPE_U8C3_PACKAGE类型的ot_svp_img图像图所示 |
|||
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]; |
||
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图像图所示; |
|||
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图像图所示; |
|||
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图像图所示; |
|||
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图像图所示。 |
特殊输出数据类型
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的跨度;
图 12 ot_svp_mem_info 类型的数据内存示意

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

块数据类型
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_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);
【参数】
注:
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模式。
【返回值】
【需求】
头文件: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。
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的低字节填充。
【举例】
无。
【相关主题】
无。
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);
【参数】
注:U8C1\YUV420SP\YUV422SP均为ot_svp_img_type成员的简写,后续其他的成员在表述中也用相同的规则简写。
【返回值】
【需求】
头文件: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所示。
其中,_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);
【参数】
【返回值】
【需求】
头文件: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¶
【描述】
创建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);
【参数】
【返回值】
【需求】
头文件: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_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);
【参数】
【返回值】
【需求】
头文件: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所示。
其中,
对应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);
【参数】
【返回值】
【需求】
头文件: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。


根据
、
以及
取对应上图中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);
【参数】
【返回值】
失败,参见错误码。 |
【需求】
头文件:ot_common_ive.h、ot_common_svp.h、ss_ mpi_ive.h
库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)
【注意】
模板系数只能为0或255。
模板样例





其中,公式中|为位或运算,&为位与运算,%为取余运算。
对应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);
【参数】
【返回值】
【需求】
头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h
库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)
【注意】
模板系数只能为0或255。
模板样例





其中,公式中|为位或运算,&为位与运算,%为取余运算。
对应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 );
【参数】
【返回值】
【需求】
头文件: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并不需要满足变量命名含义中的大小关系。
【举例】
无。
【相关主题】
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 );
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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_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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
|
内存至少配置1024字节,如图14; |
||
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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并不需要满足变量命名含义中的大小关系。
【举例】
无。
【相关主题】
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);
【参数】
【返回值】
【需求】
头文件: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并不需要满足变量命名含义中的大小关系。
【举例】
无。
【相关主题】
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);
【参数】
【返回值】
【需求】
头文件: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。
【举例】
无。
【相关主题】
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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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 );
【参数】
【返回值】
【需求】
头文件: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_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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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 );
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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所示。
一个像素的单个高斯模型参数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所示。
一个像素的单个高斯模型参数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);
【参数】
【返回值】
【需求】
头文件: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所示。
一个像素的单个高斯模型参数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所示。
一个像素的单个高斯模型参数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 );
【参数】
|
src->width * src->height * (sizeof(ot_svp_point_u16)) + sizeof(ot_ive_canny_stack_size) |
||
【返回值】
【需求】
头文件: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¶
【描述】
灰度图的Canny边缘提取的后半部:连接边缘点,形成Canny边缘图。
【语法】
td_s32 ss_mpi_ive_canny_edge(const ot_svp_img *edge, const ot_svp_mem_info *stack);
【参数】
【返回值】
【需求】
头文件: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_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);
【参数】
【返回值】
【需求】
头文件:ot_common_ive.h、ot_common_svp.h、ss_mpi_ive.h
库文件:libss_ive.a(PC上模拟用ss_ive_clib2.x.lib)
【注意】
LBP计算公式如图1所示。
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);
【参数】
由模板和转置后的模板直接滤波,并且均归一到s8后,采用package格式存储(如图7)的图像指针。 |
||
【返回值】
【需求】
头文件: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所示。

【举例】
无。
【相关主题】
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 );
【参数】
【返回值】
【需求】
头文件: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所示。
根据输入的特征点坐标,计算出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 );
【参数】
【返回值】
【需求】
头文件: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¶
【描述】
灰度图像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);
【参数】
【返回值】
【需求】
头文件: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_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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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 );
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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);
【参数】
|
高同cur_img,宽 = cur_img->width * sizeof(ot_ive_bg_model_pixel)。 |
||
【返回值】
【解决方案差异】
【需求】
头文件: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,按从右到左由低位到高位的顺序排布:
其各个比特位表示的含义如下:
比特位只用到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);
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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)
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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)
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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);
【参数】
注:SQ16.16、SQ8.16等定点表示说明参看“定点数据类型”。
【返回值】
【解决方案差异】
【需求】
头文件: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:
输出n个预测结果向量,每个向量均是包含m3个dst_elem类型为SQ16.16或者SQ18.14的向量:
【举例】
无。
【相关主题】
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);
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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);
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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);
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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,超出部分会截断:
输出r个预测结果向量,每个均为td_u16类型的N维向量:
【举例】
无。
【相关主题】
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 );
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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);
【参数】
【返回值】
【解决方案差异】
【需求】
头文件: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);
【参数】
|
维数实际值:model-> fc_info. layer_cnt [model-> fc_info. layer_num-1] |
注:SQ18.14定点表示说明参看“定点数据类型”。
【返回值】
【解决方案差异】
【需求】
头文件: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。
该接口和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运算包参数配置表
表 2 cnn模型中全连接运算包参数配置表
以单个输入样本,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的形式输出。
【举例】
无。
【相关主题】
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);
【参数】
源数据指针。源数据为ss_mpi_ive_cnn_predict的输出。不能为空。 |
||
【返回值】
【解决方案差异】
【需求】
头文件: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所示。
该接口实现的rank-1版本,用户可根据自己的需求实现rank-n(表示最可能的n类)版本,步骤如下:
通过softmax计算出每个类别的置信度;
对置信度进行排序;
输出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);
【参数】
|
||
【返回值】
【需求】
头文件: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所示)方式下,利用标定的原图像和目标图像的基准点对,求解得到变换矩阵,然后用该变换矩阵对源图像做变化得到矫正后的目标图像:
图像透视变换应用广泛,下面以_图像分析_中的人脸矫正为例进行说明。典型的_图像分析_应用如图2所示,首先利用人脸的关键点检测算法将人脸的关键点Landmark(LMK)检测出来,不同的关键点检测算法检测到的关键点的个数各异,persp_trans算子支持最大68个关键点基准点对,通过人脸的关键点点对,建立超定线性方程并求解得到变换矩阵,将检测到的人脸几何矫正后裁剪到标准图像大小。
本算子目前支持的变换方式包括平移、缩放、旋转和斜切,求解得到的变换矩阵系数是这些变换方式的融合,变换矩阵各参数对应的变换模式的物理意义分解如图3所示。
图4给出一个具体的利用5个基准点对,眼睛(2)、鼻子(1)、嘴(2)用例,利用图示的点对,求解得到图示的变换矩阵,将250x250的人脸图像变换到标准图像库96x112分辨率的图像进行_图像分析_。
【举例】
无
【相关主题】
无
ss_mpi_ive_kcf_get_mem_size¶
【描述】
获取需要创建目标对象数的内存大小。
【语法】
td_s32 ss_mpi_ive_kcf_get_mem_size(td_u32 max_obj_num, td_u32 *size);
【参数】
【返回值】
【需求】
头文件: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¶
【描述】
创建目标链表。
【语法】
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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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 );
【参数】
【返回值】
【需求】
头文件: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)
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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实现。
算法描述如下:
KCF算法利用循环矩阵对角化等性质,将跟踪问题核化,使核化后跟踪比对的操作简化成易于并行加速的矩阵运算,提升跟踪解决方案的系统性能,KCF算法可以和HOG算子联合使用,典型的算法用例如图2所示。
跟踪问题核化、相关滤波器训练等数学推导参阅“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的相关滤波器参数训练问题通过核函数和循环矩阵对角化的性质简化为矩阵运算操作,详细数学推导参阅上面里出的参考论文。
【举例】
无
【相关主题】
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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
【返回值】
【需求】
头文件: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);
【参数】
|
||
【返回值】
【需求】
头文件: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;
存储格式分别是垂直切面和水平切面两个格式。图2表示垂直切面格式。图3表示水平切面格式。
垂直切面存储格式时,Stride是W做16byte对齐,需要分配的内存大小为2 * Stride * H*C
水平切面存储格式时,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所示。
梯度计算可以有多种方法,IVE首先计算图像每个像素各颜色分量的水平梯度
:



和垂直梯度
:



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



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

梯度方向:

本HOG算子把图像分成若干个cells,每个cell按照360度划分为9个bin(即9维特征向量),如图5所示。
【举例】
无
【相关主题】
无
ss_mpi_ive_query¶
【描述】
查询已创建任务完成情况。
【语法】
td_s32 ss_mpi_ive_query(ot_ive_handle handle, td_bool *is_finish, td_bool is_block) ;
【参数】
【返回值】
【需求】
头文件: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;
【相关主题】
无。













































