Warp Affine

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

算子效果

输入图像参数输出图像
imagerotation_angle = 45.0f
interpolation = HB_VP_INTER_LINEAR
borderType = HB_VP_BORDER_CONSTANT
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.borderType = HB_VP_BORDER_CONSTANT; vp_param.borderValue = 0; 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);