Warp Affine

仿射变换是指在向量空间中进行一次线性变换(乘以一个矩阵)并加上一个平移(加上一个向量),变换为另一个向量空间的过程。 WarpAffine算子功能为对输入图片进行仿射变换,包括图片旋转、缩放、平移等平面操作,将图片投射为任意平行四边形。

算子效果

输入图像参数输出图像
imagerotation_angle = 45.0f
interpolation = HB_VP_INTER_LINEAR
isInverse = 0
image

原理

算子通过大小为2X3的转换矩阵参数,将输入图片按照仿射的形式进行映射,映射关系如下:

[XY]=[abcd][xy]+[ef]\begin{aligned}\begin{bmatrix}X \\Y \end{bmatrix}=\begin{bmatrix}a & b \\ c & d \end{bmatrix}\begin{bmatrix}x \\y \end{bmatrix}+\begin{bmatrix}e \\f \end{bmatrix}\end{aligned}

其中 x,y 为输入图片像素坐标,X,Y 为输出图片像素坐标,a,b,c,d,e,f 为转换矩阵。

对输入图片,在加速计算过程中会被分解为多个子图(下图红色区域),每个子图都有独立的映射关系,并且转换系数与原图一致。 展示如下图:

image

其中,右侧为输入图片,左侧为输出图片。

API接口

int32_t hbVPWarpAffine(hbUCPTaskHandle_t *taskHandle, 
                       hbVPImage *dstImg, 
                       hbVPImage const *srcImg,
                       hbVPAffineParam const *affineParam);

详细接口信息请查看 hbVPWarpAffine

使用方法

// Include the header
#include "hobot/hb_ucp.h"
#include "hobot/vp/hb_vp.h"
#include "hobot/vp/hb_vp_warp_affine.h"

// init Image, allocate memory for image data
hbUCPSysMem src_mem;
hbUCPMallocCached(&src_mem, src_stride * src_height, 0);
hbVPImage src_img{HB_VP_IMAGE_FORMAT_Y,
                  HB_VP_IMAGE_TYPE_U8C1,
                  src_width,
                  src_height,
                  src_width,
                  src_mem.virAddr,
                  src_mem.phyAddr,
                  nullptr,
                  0,
                  0};

hbUCPSysMem dst_mem;
hbUCPMallocCached(&dst_mem, dst_stride * dst_height, 0);
hbVPImage dst_img{HB_VP_IMAGE_FORMAT_Y,
                  HB_VP_IMAGE_TYPE_U8C1,
                  dst_width,
                  dst_height,
                  dst_stride,
                  dst_mem.virAddr,
                  dst_mem.phyAddr,
                  nullptr,
                  0,
                  0};

// init param
hbVPAffineParam vp_param;
vp_param.transformMatrix[6]= {0};
vp_param.interpolation = HB_VP_INTER_LINEAR;
vp_param.isInverse = 0;

// init task handle and schedule param
hbUCPTaskHandle_t task_handle{nullptr};
hbUCPSchedParam sched_param;
HB_UCP_INITIALIZE_SCHED_PARAM(&sched_param);
sched_param.backend = HB_UCP_DSP_CORE_0;

// create task
hbVPWarpAffine(&task_handle, &dst_img, &src_img, &vp_param);

// submit task
hbUCPSubmitTask(task_handle, &sched_param);

// wait for task done 
hbUCPWaitTaskDone(task_handle, 0);

// release task handle
hbUCPReleaseTask(task_handle);

// release memory
hbUCPFree(&src_mem);
hbUCPFree(&dst_mem);