hbVPWarpAffine

typedef struct {
  float transformMatrix[6];
  int8_t interpolation;
  int8_t borderType;
  uint8_t borderValue;
  int8_t isInverse;
} hbVPAffineParam;

WarpAffine算子参数。

  • 成员

    成员名称描述
    transformMatrix[6]WarpAffine转换矩阵(dst->src),2X3矩阵。
    interpolationWarpAffine中的插值类型,只支持 hbVPInterpolationType 中的NEAREST和LINEAR类型。
    borderType保留参数。
    borderValue保留参数。
    isInverse标志transformMatrix是否为逆矩阵,非零表示逆矩阵(src = M * dst),0表示正矩阵(dst = M * src)
int32_t hbVPWarpAffine(hbUCPTaskHandle_t *taskHandle, 
                       hbVPImage *dstImg, 
                       hbVPImage const *srcImg,
                       hbVPAffineParam const *affineParam);

调用WarpAffine API。

  • 参数
    • [out] taskHandle 任务句柄,负责算子与UCP架构的交互。
    • [out] dstImg 输出图像,type和format与输入图像一致,尺寸大小由转换矩阵计算得出。
    • [in] srcImg 输入图像,type支持U8C1,format支持Y和nv12。
    • [in] affineParam 算子参数。
  • 返回值
    • 返回 0 则表示API成功执行,否则执行失败。
注解

仿射算子在某些场景下会回退到 ref 代码分支(非优化的参考实现分支),性能下降。判断条件如下:

设 transformMatrix 为 2x3 仿射矩阵,元素布局如下:

a11 a12 xt
a21 a22 yt

即 transformMatrix[0..5] 依次对应 a11, a12, xt, a21, a22, yt。

定义:

float32_t amax = fmax(fmax(fmax(fabs(a11), fabs(a12)), fmax(fabs(a21), fabs(a22))),
                      fmax(fabs(xt), fabs(yt)));

记 dstWidth、dstHeight 为输出图像的宽和高,定义:

float32_t x_max = fabs(a11) * (dstWidth + 0.5) +
                  fabs(a12) * (dstHeight + 0.5) + fabs(xt) - 0.5;
float32_t y_max = fabs(a21) * (dstWidth + 0.5) +
                  fabs(a22) * (dstHeight + 0.5) + fabs(yt) - 0.5;

当同时满足下列两组条件时算子走优化分支:

条件一(矩阵元素溢出判断):

amax <= ((1 << 13) - 1) &&
(xt - a12) <= ((1 << 13) - 1) &&
(yt - a22) <= ((1 << 13) - 1)

条件二(输出坐标溢出判断):

x_max <= ((1 << 13) - 1) &&
y_max <= ((1 << 13) - 1)

任一组条件不满足时,算子内部会判定为边界条件溢出,回退到 ref 分支执行。具体实现请参考 DSP 算子源码。