/********************************************************************************** * * Copyright (c) 2019-2020 Beijing AXera Technology Co., Ltd. All Rights Reserved. * * This source file is the property of Beijing AXera Technology Co., Ltd. and * may not be copied or distributed in any isomorphic form without the prior * written consent of Beijing AXera Technology Co., Ltd. * **********************************************************************************/ #ifndef __AX_NPU_IMGPROC_H__ #define __AX_NPU_IMGPROC_H__ #include "./npu_common.h" #include "ax_interpreter_external_api.h" #ifdef __cplusplus extern "C" { #endif /*! * 函数功能描述: *
获取 NPU-CV KIT 版本号。 */ const AX_S8* AX_NPU_CV_Version(); /*! * 函数功能描述: *
实现图像的 Crop 操作。为了高效灵活的使用,支持同时从src图像中处理多个子图,支持选择虚拟NPU模式类别 * \warning 支持处理:NV12/NV21/BGR/RGB/GRAY;支持4K分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: src图像指针 * \param nDestSize: 子图数量 * \param pDestImages: dst图像指针数组,可以同时输出多个结果 * \param pBoxes: 各子图bounding box指针数组,NV12/NV21需要fW、fH为偶数。如果`pBoxes[i]`或`pBoxes`为空则表示不做crop操作。 */ int AX_NPU_CV_CropImage(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pSrc, const AX_U32 nDestSize, AX_NPU_CV_Image** pDestImages, AX_NPU_CV_Box** pBoxes); typedef enum _AX_NPU_CV_ImageResizeAlignParam { AX_NPU_CV_IMAGE_FORCE_RESIZE = 0, // without keep aspect ratio, others keep aspect ratio AX_NPU_CV_IMAGE_HORIZONTAL_LEFT = 1, // border on the right of the image AX_NPU_CV_IMAGE_HORIZONTAL_CENTER = 2, // border on both sides of the image AX_NPU_CV_IMAGE_HORIZONTAL_RIGHT = 3, // border on the left of the image AX_NPU_CV_IMAGE_VERTICAL_TOP = AX_NPU_CV_IMAGE_HORIZONTAL_LEFT, // border on the bottom of the image AX_NPU_CV_IMAGE_VERTICAL_CENTER = AX_NPU_CV_IMAGE_HORIZONTAL_CENTER, // border on both sides of the image AX_NPU_CV_IMAGE_VERTICAL_BOTTOM = AX_NPU_CV_IMAGE_HORIZONTAL_RIGHT, // border on the top of the image } AX_NPU_CV_ImageResizeAlignParam; /*! * 函数功能描述: *
实现crop然后在保持纵横比的前提下,从给定的图像resize为相同的形状。 *
支持选择虚拟NPU模式类别。 * \warning 支持处理:NV12/NV21/BGR/RGB/GRAY;支持4K分辨率;水平或垂直方向缩小比例要小于32。 * \warning 在较大输入/输出分辨率场景,可能会触发硬件限制条件,报错时会打印详细参数信息。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: src图像指针,支持配置宽度方向stride,若为0则默认stride为宽度大小 * \param nDestSize: 子图数量 * \param pDestImages: dst图像指针数组,可以同时输出多个结果,但图像shape相同;支持配置宽度方向stride,若为0则默认stride为宽度大小 * \param pBoxes: 各子图bounding_box指针数组,NV12/NV21/RGB/BGR需要fW、fH为偶数。如果`pBoxes[i]`或`pBoxes`为空则表示不做crop操作 * \param eImageResizeAlignParamHorizontal: 输出图像水平对齐方式 * \param eImageResizeAlignParamVertical: 输出图像纵向对齐方式 * \param tColor: 用于按指定颜色填充border */ int AX_NPU_CV_CropResizeImage(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pSrc, const AX_U32 nDestSize, AX_NPU_CV_Image** pDestImages, AX_NPU_CV_Box** pBoxes, const AX_NPU_CV_ImageResizeAlignParam eImageResizeAlignParamHorizontal, const AX_NPU_CV_ImageResizeAlignParam eImageResizeAlignParamVertical, const AX_NPU_CV_Color tColor); /*! * 函数功能描述: *
实现Y和UV分离的扣图和缩放操作,从给定的图像resize为相同的形状。 *
输入/输出图像尺寸、stride以及box坐标需要设置为偶数。 *
支持选择虚拟NPU模式类别。 * \warning 支持处理Y和UV分离的NV12/NV21图像;支持4K分辨率;水平或垂直方向缩小比例要小于32。 * \warning 在较大输入/输出分辨率场景,可能会触发硬件限制条件,报错时会打印详细参数信息。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrcY: 输入Y图像指针,支持配置宽度方向stride,若为0则默认stride为宽度大小 * \param pSrcUV: 输入UV图像指针,图像宽度、高度和stride与输入Y图像保持一致 * \param nDestSize: 子图数量 * \param pDestImagesY: 输出Y图像指针数组,可以同时输出多个结果,但图像shape相同;支持配置宽度方向stride,若为0则默认stride为宽度大小 * \param pDestImagesUV: 输出UV图像指针数组,可以同时输出多个结果,但图像shape相同;输出UV图像宽度、高度和stride与输出Y图像保持一致 * \param pBoxes: 各子图bounding_box指针数组,要求fW、fH为偶数。如果`pBoxes[i]`为空则表示不做crop操作 * \param eImageResizeAlignParamHorizontal: 输出图像水平对齐方式 * \param eImageResizeAlignParamVertical: 输出图像纵向对齐方式 * \param tColor: 用于按指定颜色填充border */ int AX_NPU_CV_CropResizeImageForSplitYUV(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pSrcY, const AX_NPU_CV_Image* pSrcUV, const AX_U32 nDestSize, AX_NPU_CV_Image** pDestImagesY, AX_NPU_CV_Image** pDestImagesUV, AX_NPU_CV_Box** pBoxes, const AX_NPU_CV_ImageResizeAlignParam eImageResizeAlignParamHorizontal, const AX_NPU_CV_ImageResizeAlignParam eImageResizeAlignParamVertical, const AX_NPU_CV_Color tColor); /*! * 定义 AX_NPU_CV_AlphaBlendingWithMask 算子上下文 */ typedef AX_VOID* AX_NPU_CV_AlphaBlendingContext; /*! * 函数功能描述: *
实现前景和背景为NV12/NV21/BGR/RGB的图像按Gray Mask做blending操作。 *
背景图为整图,前景图可以只和背景图部分区域相对应,此时需要指定前景图相对背景图区域的偏移坐标。 *
blending功能完成后将结果overlay到背景图相应区域。 * \warning 背景图做blending区域不能超出图像实际范围。 * \warning 程序退出前,需要调用 AX_NPU_CV_DestroyAlphaBlendingContext 释放算子上下文。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pBackground: 背景图像指针,支持NV12/NV21/BGR/RGB * \param pForeground: 前景图像指针,支持NV12/NV21/BGR/RGB,色彩空间与背景图一致 * \param pMask: Gray图像指针,Mask图像宽、高与前景图宽、高不一致时,算子内部会resize到一致。alpha值范围为[0,128]来表示小数[0,1]。 * \param nOffsetW: 指定背景图blending区域起始位置宽度 * \param nOffsetH: 指定背景图blending区域起始位置高度 */ int AX_NPU_CV_AlphaBlendingWithMask(AX_NPU_CV_AlphaBlendingContext* pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, AX_NPU_CV_Image* pBackground, const AX_NPU_CV_Image* pForeground, const AX_NPU_CV_Image* pMask, AX_U32 nOffsetW, AX_U32 nOffsetH); /*! * 函数功能描述: *
实现前景和背景为NV12/NV21/BGR/RGB的图像按Gray Mask做blending操作。 *
背景图为整图,前景图可以只和背景图部分区域相对应,此时需要指定前景图相对背景图区域的偏移坐标。 *
blending功能完成后将结果输出到目标地址相应区域。 * \warning 背景图做blending区域不能超出图像实际范围。 * \warning 程序退出前,需要调用 AX_NPU_CV_DestroyAlphaBlendingContext 释放算子上下文。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pBackground: 背景图像指针,支持NV12/NV21/BGR/RGB * \param pForeground: 前景图像指针,支持NV12/NV21/BGR/RGB,色彩空间与背景图一致 * \param pMask: Gray图像指针,Mask图像宽、高与前景图宽、高不一致时,算子内部会resize到一致。alpha值范围为[0,128]来表示小数[0,1]。 * \param pDst: 输出图像指针,支持NV12/NV21/BGR/RGB * \param nOffsetW: 指定背景图blending区域起始位置宽度 * \param nOffsetH: 指定背景图blending区域起始位置高度 */ int AX_NPU_CV_AlphaBlendingWithMaskV2(AX_NPU_CV_AlphaBlendingContext* pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pBackground, const AX_NPU_CV_Image* pForeground, const AX_NPU_CV_Image* pMask, AX_NPU_CV_Image* pDst, AX_U32 nOffsetW, AX_U32 nOffsetH); /*! * 函数功能描述:
销毁 AX_NPU_CV_AlphaBlendingWithMask 算子上下文 * \param tContext: AX_NPU_CV_AlphaBlendingWithMask 算子上下文 */ void AX_NPU_CV_DestroyAlphaBlendingContext(AX_NPU_CV_AlphaBlendingContext tContext); /*! * 函数功能描述:
实现不同色彩空间转换
|++ from +++|++ to +++|
NV12/NV21==>>BGR/YUV444/LAB/YUYV/UYVY
YUV444==>>GRAY
RAW10==>>RAW16
RAW12==>RAW16
RGB==>> BGR/LAB
BGR==>>NV12/YUV444/RGB
YUYV/UYVY==>>NV12/NV21
YUV420_LEGACY==>>NV12
RGB/YUV420转LAB时,NPU模式仅支持disable和1_1_1 * \warning 请确保输入图像和输出图像尺寸相同;支持4K分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入图像指针 * \param pDst: 输出图像指针 */ int AX_NPU_CV_CSC(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pSrc, AX_NPU_CV_Image* pDst); /*! * 函数功能描述:
实现矩阵乘:C = alphaAB^T,支持选择虚拟 NPU 模式类别
矩阵 A 和 B 数据类型一致,当输入矩阵 A 数据类型为 int8 时,输出矩阵 C 数据类型为 int16;当输入矩阵 A 数据类型为 float 时,输出矩阵 C 数据类型为 float; * \warning N 和 K 数值不宜过大,否则硬件不支持; * \param eVirtualNpuMode: 支持虚拟NPU模式类别:disable 和 111 * \param fAlpha: 矩阵乘的系数 * \param pA: 矩阵 A(MxK),支持 int8, float * \param pB: 矩阵 B(NxK),支持 int8, float * \param pC: 矩阵 C(MxN), 矩阵乘的结果,支持 int16,float;需要用户分配内存 */ int AX_NPU_CV_MatMul(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_F32 fAlpha, const AX_NPU_CV_Matrix2D* pA, const AX_NPU_CV_Matrix2D* pB, AX_NPU_CV_Matrix2D* pC); /*! * 定义 AX_NPU_CV_Laplacian 算子上下文 */ typedef AX_VOID* AX_NPU_CV_LaplacianContext; typedef struct _AX_NPU_CV_LaplacianParams { AX_S8 nKernelValue[9]; } AX_NPU_CV_LaplacianParams; /*! * 函数功能描述: *
实现对输入矩阵进行拉普拉斯变换操作。 *
输入矩阵行和列数要求2对齐;最小支持 2x32;最大支持 4K 分辨率。 * \warning 程序退出前,需要调用 AX_NPU_CV_DestroyLaplacianContext 释放算子上下文。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入矩阵,支持 uint8 * \param pDst: 输出矩阵,支持 uint16/int16;需要用户分配内存 * \param pLaplacianParams: 拉普拉斯变换模版系数;如果系数不需要更新,`pLaplacianParams`可给空指针,算子内部会使用`*Context`中的参数来计算; */ int AX_NPU_CV_Laplacian(AX_NPU_CV_LaplacianContext* pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst, AX_NPU_CV_LaplacianParams* pLaplacianParams); /*! * 函数功能描述:
销毁 AX_NPU_CV_Laplacian 算子上下文 * \param tContext: AX_NPU_CV_Laplacian 算子上下文 */ void AX_NPU_CV_DestroyLaplacianContext(AX_NPU_CV_LaplacianContext tContext); /*! * 函数功能描述: *
实现对输入矩阵的像素值乘以比例系数。 *
输入矩阵行和列数要求2对齐;最小支持 2x32;最大支持 4K 分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入矩阵,支持 uint16/int16; * \param pDst: 输出矩阵,支持 uint16/int16;需要用户分配内存 * \param fScaleRatio: 比例系数, 支持范围[-8, 8) */ int AX_NPU_CV_MultRatio(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst, AX_F64 fScaleRatio); /*! * 函数功能描述: *
实现两个输入矩阵中对应位置元素相乘 *
输入矩阵行和列数要求2对齐;最小支持 2x32;最大支持 4K 分辨率。 * \warning 由于虚拟NPU模式下,NPU内部计算单元近似取整方式不同,1_1_1模式下为ROUND_TO_EVEN, 1_1_2和disable模式下为四舍五入,故相同输入在不同虚拟NPU模式下结果会略有差异。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc0: 输入矩阵,支持 uint16/int16; * \param pSrc1: 输入矩阵,支持 uint8,实际含义为u1.7,即1bit整数,7bit小数; * \param pDst: 输出矩阵,支持 uint16/int16;需要用户分配内存 */ int AX_NPU_CV_HadamardProduct(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc0, const AX_NPU_CV_Matrix2D* pSrc1, AX_NPU_CV_Matrix2D* pDst); /*! * AX_NPU_CV_Thresh 算子模式 */ typedef enum { AX_NPU_CV_THRESH_MODE_BINARY = 0, /*! iLowThresh, dst = iMaxValue*/ AX_NPU_CV_THRESH_MODE_CLIP_MAX = 1, /*! iLowThresh, dst = iMaxValue*/ AX_NPU_CV_THRESH_MODE_CLIP_MIN = 2, /*! iLowThresh, dst = src*/ AX_NPU_CV_THRESH_MODE_MIN_MID_MAX = 3, /*! iHighThresh, dst = iMaxValue*/ AX_NPU_CV_THRESH_MODE_ORI_MID_MAX = 4, /*! iHighThresh, dst = iMaxValue*/ AX_NPU_CV_THRESH_MODE_MIN_MID_ORI = 5, /*! iHighThresh, dst = src*/ AX_NPU_CV_THRESH_MODE_MIN_ORI_MAX = 6, /*! iHighThresh, dst = iMaxValue*/ AX_NPU_CV_THRESH_MODE_ORI_MID_ORI = 7, /*! iHighThresh, dst = src*/ } AX_NPU_CV_THRESH_MODE_E; /*! * AX_NPU_CV_Thresh 算子参数 */ typedef struct _AX_NPU_CV_ThreshParams { AX_S32 iLowThresh; /*!<低阈值 */ AX_S32 iHighThresh; /*!<高阈值 */ AX_S32 iMinValue; /*!<最小值 */ AX_S32 iMidValue; /*!<中间值 */ AX_S32 iMaxValue; /*!<最大值 */ AX_NPU_CV_THRESH_MODE_E eMode; /*!<阈值化模式 */ } AX_NPU_CV_ThreshParams; /*! * 定义 AX_NPU_CV_Thresh 算子上下文 */ typedef AX_VOID* AX_NPU_CV_ThreshContext; /*! * 函数功能描述: *
实现输入矩阵阈值化 *
输入矩阵行和列数要求2对齐;最小支持 2x32;最大支持 4K 分辨率。 * \warning 只有在`BINARY`和`MIN_MID_MAX`模式下,允许输入输出数据类型不一致,其它模式下输入输出数据类型必须一致 * \warning `iLowThresh` 和 `iHighThresh` 不能超出输入数据类型值域范围,且iLowThresh <= iHighThresh * \warning `iMinValue`、`iMidValue`和`iMaxValue`不能超出输出数据类型值域范围 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入矩阵,支持 uint16/int16/uint8; * \param pThreshParams: 阈值化算子参数 * \param pDst: 输出矩阵,支持 uint16/int16/uint8;需要用户分配内存 */ int AX_NPU_CV_Thresh(AX_NPU_CV_ThreshContext* pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, const AX_NPU_CV_ThreshParams* pThreshParams, AX_NPU_CV_Matrix2D* pDst); /*! * 函数功能描述:
销毁 AX_NPU_CV_Thresh 算子上下文 * \param tContext: AX_NPU_CV_Thresh 算子上下文 */ void AX_NPU_CV_DestroyThreshContext(AX_NPU_CV_LaplacianContext tContext); /*! * 函数功能描述: *
实现图像仿射变换 * \param eVirtualNpuMode: 虚拟NPU模式类别, 仅支持disable和1_1_2 * \param pSrc: 输入图像,支持BGR/RGB/RGBA/RGGB-4ch 8bit/16bit, 支持YUV420(NV12/NV21),最大支持 4K 分辨率 * \param pDst: 输出图像,格式和channel需要和输入一致 * \param pMat33: 3x3变换矩阵 * \param interp: 支持BILINEAR、NEAREST两种插值方式 * \param const_val: 越界点设为该值 */ int AX_NPU_CV_Warp(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pSrc, const AX_NPU_CV_Image* pDst, const float *pMat33, const AX_NPU_CV_Interp interp, const int const_val); /* *
实现前景RGBA和背景RGBA/NV12的图像做blending操作。 *
背景图为整图,前景图可以只和背景图部分区域相对应,此时需要指定前景图相对背景图区域的偏移坐标。 *
blending功能完成后将结果输出到目标地址相应区域。 * \warning 背景图做blending区域不能超出图像实际范围。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pBackground: 背景图像指针,支持RGBA/NV12 * \param pForeground: 前景图像指针,支持RGBA * \param pDst: 输出图像指针,支持RGBA * \param nOffsetW: 指定背景图blending区域起始位置宽度 * \param nOffsetH: 指定背景图blending区域起始位置高度 */ int AX_NPU_CV_AlphaBlending( const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, AX_NPU_CV_Image* pBackground, const AX_NPU_CV_Image* pForeground, AX_NPU_CV_Image* pDst, AX_U32 nOffsetW, AX_U32 nOffsetH); typedef AX_VOID* AX_NPU_CV_L2NormalizeContext; /*! * 函数功能描述: *
实现对输入矩阵进行 L2 normalize 计算 *
输入矩阵行和列数要求2对齐;最小支持 2x32;最大支持 4K 分辨率。 * \param pContext: AX_NPU_CV_L2Normalize 算子上下文 * \param eVirtualNpuMode: 虚拟NPU模式类别, 支持disable和1_1_1 * \param pSrc: 输入矩阵,支持 float; * \param pDst: 输出矩阵,支持 float;需要用户分配内存 */ int AX_NPU_CV_L2Normalize(AX_NPU_CV_L2NormalizeContext*pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /*! * 函数功能描述: *
Destroy L2Normalize算子的上下文 * \param tContext: AX_NPU_CV_L2Normalize 算子上下文 */ void AX_NPU_CV_DestroyL2NormalizeContext(AX_NPU_CV_L2NormalizeContext tContext); /*! *
Saxpy:C = alpha*A + B *
最大支持 2048x4096x1(HWC) 分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,支持disable和1_1_1 * \param fAlpha: 系数 alpha * \param pA: 输入矩阵 A,支持 float/int8 * \param pB: 输入矩阵 B,支持 float/int8 * \param pC: 输出矩阵 C,支持 float/int8/int16 */ int AX_NPU_CV_Saxpy(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_F32 fAlpha, const AX_NPU_CV_Matrix2D* pA, const AX_NPU_CV_Matrix2D* pB, AX_NPU_CV_Matrix2D* pC); /*! * 定义 AX_NPU_CV_Sgemm 算子上下文 */ typedef AX_VOID* AX_NPU_CV_SgemmContext; /*! * 函数功能描述:
销毁 AX_NPU_CV_Sgemm 算子上下文 * \param tContext: AX_NPU_CV_Sgemm 算子上下文 */ void AX_NPU_CV_DestroySgemmContext(AX_NPU_CV_SgemmContext tContext); /*! *
Sgemm:D = alpha*op( A )*op( B ) + beta*C,暂时不支持输入 C 矩阵 *
最大支持 2048x2048x1(HWC)分辨率。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1 * \param bTransA: 是否对 A 矩阵转置,False:op( A ) = A, True:op( A ) = A^T, * \param bTransB: 是否对 B 矩阵转置,False:op( B ) = B, True:op( B ) = B^T, * \param fAlpha: 系数 alpha * \param pA: 输入矩阵 A,支持 float * \param pB: 输入矩阵 B,支持 float * \param fBeta: 系数 beta * \param pC: 输入矩阵 C,支持 float * \param pD: 输出矩阵 D,支持 float */ int AX_NPU_CV_Sgemm(AX_NPU_CV_SgemmContext* pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_BOOL bTransA, const AX_BOOL bTransB, const AX_F32 fAlpha, const AX_NPU_CV_Matrix2D* pA, const AX_NPU_CV_Matrix2D* pB, const AX_F32 fBeta, const AX_NPU_CV_Matrix2D* pC, AX_NPU_CV_Matrix2D* pD); /*! * 定义 AX_NPU_CV_MatAdd/AX_NPU_CV_MatSub 算子上下文 */ typedef AX_VOID* AX_NPU_CV_ConvArithContext; /*! * 函数功能描述:
销毁 AX_NPU_CV_MatAdd /AX_NPU_CV_MatSub算子上下文 * \param tContext: AX_NPU_CV_MatAdd 算子上下文 */ AX_VOID AX_NPU_CV_DestroyConvArithContext(AX_NPU_CV_ConvArithContext tContext); /*! *
AX_NPU_CV_MatAdd: 实现矩阵 C = A + B *
最小支持 1x16;最大支持4096x4096x1(HWC)分辨率。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pAdd1: 输入A矩阵,支持uint8 * \param pAdd2: 输入B矩阵,支持uint8 * \param pDst: 输出C矩阵,支持uint8, 结果clip到(0,255) */ int AX_NPU_CV_MatAdd(AX_NPU_CV_ConvArithContext *pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, AX_NPU_CV_Matrix2D *pAdd1, AX_NPU_CV_Matrix2D *pAdd2, AX_NPU_CV_Matrix2D * pDst); /*! *
AX_NPU_CV_MatSub: 实现矩阵 C = A - B *
最小支持 1x16;最大支持 4096x4096x1(HWC)分辨率。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pAdd1: 输入A矩阵,支持uint8 * \param pAdd2: 输入B矩阵,支持uint8 * \param pDst: 输出C矩阵,支持uint8, 结果clip到(0,255), int8, 结果clip到(-128,127) */ int AX_NPU_CV_MatSub(AX_NPU_CV_ConvArithContext *pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, AX_NPU_CV_Matrix2D *pAdd1, AX_NPU_CV_Matrix2D *pAdd2, AX_NPU_CV_Matrix2D * pDst); /*! * 定义 AX_NPU_CV_MatSubAbs 算子上下文 */ typedef struct _AX_NPU_CV_SubAbsContext{ AX_VOID* ctx1; AX_VOID* ctx2; }AX_NPU_CV_SubAbsContext; /*! * 函数功能描述:
销毁 AX_NPU_CV_MatSubAbs 算子上下文 * \param tContext: AX_NPU_CV_MatSubAbs 算子上下文 */ AX_VOID AX_NPU_CV_DestroySubAbsContext(AX_NPU_CV_SubAbsContext tContext); /*! *
AX_NPU_CV_MatSubAbs: 实现矩阵 C = |A - B| *
最小支持 1x16;最大支持 4096x4096 分辨率。 * \param pContext: 算子上下文指针。如果 `*pContext` 为空指针, 算子内部会自动分配内存。 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pAdd1: 输入A矩阵,支持uint8 * \param pAdd2: 输入B矩阵,支持uint8 * \param pDst: 输出C矩阵,支持uint8, 结果clip到(0,255) */ int AX_NPU_CV_MatSubAbs(AX_NPU_CV_SubAbsContext *pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, AX_NPU_CV_Matrix2D *pAdd1, AX_NPU_CV_Matrix2D *pAdd2, AX_NPU_CV_Matrix2D * pDst); /*! *
Sigmoid:sigmoid算子, y = 1/(1+exp(-x)) *
最小支持 1x16;最大支持 2048x4096x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1 * \param pSrc: 输入矩阵 pSrc,支持 float, 范围[-20,20]。 * \param pDst: 输出矩阵 pDst,支持 float */ int AX_NPU_CV_Sigmoid(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /*! *
Softmax:按行计算矩阵的Softmax *
最大支持 1024x2048x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别, 仅支持disable和1_1_1 * \param pSrc: 输入矩阵 pSrc,支持 float * \param pDst: 输出矩阵 pDst,支持 float */ int AX_NPU_CV_Softmax(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /* * 统计方法 */ typedef enum _AX_NPU_CV_StatsMethod { AX_NPU_CV_SM_SUM = 0, // 统计和 AX_NPU_CV_SM_MAX = 1, // 统计最大值 AX_NPU_CV_SM_ARGMAX = 2, // 统计最大值位置 AX_NPU_CV_SM_MIN = 3, // 统计最小值 AX_NPU_CV_SM_ARGMIN = 4, // 统计最小值位置 } AX_NPU_CV_StatsMethod; /*! *
函数功能描述: 按行统计矩阵元素,功能包括:求和(sum),最大值(max),最大值位置(argmax),最小值(min),最小值位置(argmin) *
数据类型支持(float, int8, uint8, int16, uint16), *
float数据求max/min/argmax/argmin时,需要保证宽度16对齐 *
统计argmax/argmin时,宽度不超过8192 *
宽度不超过1600000, 宽*高不超过3072*4096 * \param eVirtualNpuMode: 虚拟NPU模式类别, 仅支持disable和1_1_1 * \param eStatsMethod: 按行统计方法 * \param pSrc: 输入矩阵 pSrc * \param pDst: 输出矩阵 pDst */ int AX_NPU_CV_Stats(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_StatsMethod eStatsMethod, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述: 计算矩阵方差 *
数据类型支持(uint8) *
最大支持 1024x1024x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1 * \param pSrc: 输入矩阵 pSrc, 仅支持uint8输入 * \param pDst: 输出矩阵 pDst, 仅支持float输出 */ int AX_NPU_CV_Variance(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /* * DMA拷贝模式: * AX_NPU_CV_DMA_MODE_DIRECT_COPY:直接快速拷贝 * AX_NPU_CV_DMA_MODE_INTERVAL_COPY: 间隔拷贝 */ typedef enum _AX_NPU_CV_DMA_MODE{ AX_NPU_CV_DMA_MODE_DIRECT_COPY, AX_NPU_CV_DMA_MODE_INTERVAL_COPY, } AX_NPU_CV_DMA_MODE; /** * DMA拷贝控制参数 * DIRECT_COPY模式下,box参数有效 * INTERVAL_COPY模式下,u8VerSegRows/u8HorSegSize/u8ElemSize参数有效, 参数有效范围(1,255) * INTERVAL_COPY模式下,要求原图height和width,分别是u8VerSegRows/u8HorSegSize的整数倍 */ typedef struct _AX_NPU_CV_DMA_CTRL{ AX_NPU_CV_DMA_MODE mode; union{ AX_NPU_CV_Box box; struct{ AX_U8 u8VerSegRows; AX_U8 u8HorSegSize; AX_U8 u8ElemSize; }; }; }AX_NPU_CV_DMA_CTRL; /*! *
函数功能描述: 提供内存拷贝的方法,支持快速拷贝模式和间隔拷贝模式 *
数据类型支持(GRAY,RGB) *
最大支持 4096x4096x1(HWC)分辨率,最小2x32 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入图像 pSrc * \param pDst: 输出图像 pDst */ int AX_NPU_CV_DMA(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, AX_NPU_CV_Image * pSrc, AX_NPU_CV_Image *pDst, AX_NPU_CV_DMA_CTRL *pstCtrl); /* * 定义NCC的输出内存信息 */ typedef struct _AX_NPU_CV_NCC_MEM_S{ AX_U64 u64Numerator;//sum(A*B),A和B矩阵的内积 AX_U64 u64QuadSum1;//sum(A*A) AX_U64 u64QuadSum2;//sum(B*B) }AX_NPU_CV_NCC_MEM; /*! *
函数功能描述:计算两相同分辨率灰度图像的归一化相互关系系数 *
数据类型支持GRAY *
最大支持 4096x4096x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc0: 输入灰度图像pSrc0 * \param pSrc1: 输入灰度图像pSrc1 * \param pDst: 输出计算结果 pDst */ int AX_NPU_CV_NCC(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Image* pSrc0, const AX_NPU_CV_Image* pSrc1, AX_NPU_CV_NCC_MEM * pDst); /*! *
函数功能描述:转置矩阵 *
数据类型支持uint8,int8,float *
最大支持 4096x4096x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别, 仅支持disable和1_1_1两种模式 * \param pSrc: 输入矩阵,仅支持uint8,int8,float * \param pDst: 输出转置矩阵,仅支持uint8,int8,float */ int AX_NPU_CV_Transpose_V2(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述:按列矩阵求和 *
数据类型支持uint8,int8,float *
最大支持 256x4096x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别, 仅支持disable模式 * \param pSrc: 输入矩阵,仅支持uint8,int8,float * \param pDst: 输出转置矩阵,仅支持uint16,float */ int AX_NPU_CV_ReduceSum(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述:转置矩阵,(N,H,W)转置为(N,W,H) *
数据类型支持uint8,int8,float *
最大支持 4x4096x4096(NHW)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别, 仅支持disable和1_1_2两种模式 * \param pSrc: 输入矩阵,仅支持uint8,int8,float * \param pDst: 输出转置矩阵,仅支持uint8,int8,float */ int AX_NPU_CV_Transpose_3Dim(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix3D* pSrc, AX_NPU_CV_Matrix3D* pDst); /*! *
函数功能描述:计算矩阵abs *
数据类型支持int8 *
最大支持 2048x2048x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc: 输入矩阵 pSrc, 仅支持int8 * \param pDst: 输出计算结果 pDst, 仅支持uint8 */ int AX_NPU_CV_ABS(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, const AX_NPU_CV_Matrix2D* pDst); typedef AX_VOID* AX_NPU_CV_Dilate_Context; typedef struct _AX_NPU_CV_DilateParam { AX_U8 nKernelValue[9]; } AX_NPU_CV_DilateParam; /*! *
函数功能描述:对二值图像进行膨胀操作, *
模板支持3x3kernel, 模板系数只能是0或255。 *
计算方法为,取目标像素周围3x3个点,与kernel按位与运算,再对9个点的结果取位或运算 *
结果如果为0则目标点置为暗点(0),如果为非0,目标点置为亮点(255) *
数据类型支持二值图像uint8 *
最大支持 4096x4096x1(HWC)分辨率,最小支持2x32。 * \param pContext: 上下文,如果为null,则内部分配空间 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入矩阵 pSrc, 仅支持uint8 * \param pDst: 输出计算结果 pDst, 仅支持uint8 * \param param: 膨胀算子的kernel参数,仅支持3x3 kernel */ int AX_NPU_CV_Dilate(AX_NPU_CV_Dilate_Context * pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst, AX_NPU_CV_DilateParam *param); void AX_NPU_CV_DestroyDilateContext(AX_NPU_CV_Dilate_Context tContext); typedef struct _AX_NPU_CV_Erode_Context{ AX_VOID* th_ctx; AX_VOID* lp_ctx; } AX_NPU_CV_Erode_Context; typedef AX_NPU_CV_DilateParam AX_NPU_CV_ErodeParam; /*! *
函数功能描述:对二值图像进行腐蚀操作 *
模板支持3x3kernel, 模板系数只能是0或255。 *
计算方法为,取目标像素周围3x3个点,与kernel进行位或运算,再对9个点的结果取位与运算 *
结果如果为0则目标点置为暗点(0),如果为非0,目标点置为亮点(255) *
数据类型支持二值图像uint8 *
最大支持 4096x4096x1(HWC)分辨率,最小支持2x32。 * \param pContext: 上下文,如果为null,则内部分配空间 * \param eVirtualNpuMode: 虚拟NPU模式类别 * \param pSrc: 输入矩阵 pSrc, 仅支持uint8 * \param pDst: 输出计算结果 pDst, 仅支持uint8 * \param param: 腐蚀算子的kernel参数,仅支持3x3 kernel */ int AX_NPU_CV_Erode(AX_NPU_CV_Erode_Context * pContext, const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst, AX_NPU_CV_ErodeParam *param); void AX_NPU_CV_DestroyErodeContext(AX_NPU_CV_Erode_Context tContext); /*! *
函数功能描述:计算两矩阵相与的结果 *
数据类型支持二值图像uint8 *
最大支持 2048x2048x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc0: 输入矩阵 pSrc0, 仅支持uint8 * \param pSrc1: 输入矩阵 pSrc1, 仅支持uint8 * \param pDst: 输出计算结果 pDst, 仅支持uint8 */ int AX_NPU_CV_AND(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc0, const AX_NPU_CV_Matrix2D* pSrc1, const AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述:计算两矩阵相或的结果 *
数据类型支持二值图像uint8 *
最大支持 2048x2048x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc0: 输入矩阵 pSrc0, 仅支持uint8 * \param pSrc1: 输入矩阵 pSrc1, 仅支持uint8 * \param pDst: 输出计算结果 pDst, 仅支持uint8 */ int AX_NPU_CV_OR(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc0, const AX_NPU_CV_Matrix2D* pSrc1, const AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述:计算两矩阵相异或的结果 *
数据类型支持二值图像uint8 *
最大支持 2048x2048x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc0: 输入矩阵 pSrc0, 仅支持uint8 * \param pSrc1: 输入矩阵 pSrc1, 仅支持uint8 * \param pDst: 输出计算结果 pDst, 仅支持uint8 */ int AX_NPU_CV_XOR(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc0, const AX_NPU_CV_Matrix2D* pSrc1, const AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述:计算矩阵arctan *
数据类型支持int8,uint8,float *
最大支持 2048x2048x1(HWC)分辨率。 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc: 输入矩阵 pSrc, 数据类型int8,uint8,float * \param pDst: 输出计算结果 pDst,数据类型float */ int AX_NPU_CV_Arctan(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc, AX_NPU_CV_Matrix2D* pDst); /*! *
函数功能描述:计算矩阵arctan2 *
数据类型支持int8,uint8,float *
最大支持 2048x2048x1(HWC)分辨率 * \param eVirtualNpuMode: 虚拟NPU模式类别,仅支持disable和1_1_1两种模式 * \param pSrc1: 输入矩阵 pSrc1, 数据类型int8,uint8,float * \param pSrc2: 输入矩阵 pSrc2, 数据类型int8,uint8,float * \param pDst: 输出计算结果 pDst,数据类型float */ int AX_NPU_CV_Arctan2(const AX_NPU_SDK_EX_MODEL_TYPE_T eVirtualNpuMode, const AX_NPU_CV_Matrix2D* pSrc1, const AX_NPU_CV_Matrix2D* pSrc2, AX_NPU_CV_Matrix2D* pDst); #ifdef __cplusplus } #endif #endif