鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

WarpAffineNearest

用于使用最近邻插值方法对图像执行仿射变换。

在调用WarpAffineNearest函数之前需要先调用Init函数进行初始化,然后调用set函数对目标图像进行初始化,再调用WarpAffineNearest主功能函数,最后调用Release函数释放相关空间。

函数接口声明如下:

  • 初始化函数:

    HmppResult HMPPI_WarpAffineNearestInit(HmppiSize srcSize, HmppiSize dstSize, double coeffs[2][3], double xCenter, double yCenter, double angle, HmppiWarpDirection direction, HmppiBorderType borderType, double borderValue, int smoothEdge, HmppiWarpPolicy** pSpec);

    HmppResult HMPPI_Set_64f_C1R(double value, double *dst, HmppiSize dstSize);

  • 主函数:

    HmppResult HMPPI_WarpAffineNearest_64f_C1R(const double *src, int srcStep, double *dst, int dstStep, HmppiPoint dstRoiOffset, HmppiSize dstRoiSize, const HmppiWarpPolicy *pSpec);

  • 释放函数:

    HmppResult HMPPI_WarpAffineNearestRelease_32f(HmppiWarpPolicy *policy);

参数

参数名

描述

取值范围

输入/输出

src

指向源图像感兴趣区域的指针。

非空

输入

srcStep

源图像中连续行起点之间的距离(以字节为单位)。

非负整数

输入

srcSize

源图像块的大小。

正整数

输入

dst

指向目标图像感兴趣区域的指针。

非空

输入/输出

dstStep

目标图像中连续行的起点之间的距离(以字节为单位)。

非负整数

输入

dstRoiOffset

目标图像块的偏移值。

非负整数

输入

dstRoiSize

目标图像块的大小。

正整数

输入

coeffs

仿射变换系数。

非空

输入

xCenter

旋转中心x坐标。

在srcSize范围内

输入

yCenter

旋转中心y坐标。

在srcSize范围内

输入

angle

旋转角度。

(-180, 180)

输入

direction

转换方向。

HMPP_WARP_FORWARD:前向变换

HMPP_WARP_BACKWARD:后向变换

输入

smoothEdge

边缘平滑标志。

0:不支持边缘平滑

输入

borderType

边界取值算法。

目前支持如下算法:

HMPPI_BORDER_REPL

HMPPI_BORDER_IN_MEM

HMPPI_BORDER_CONST

HMPPI_BORDER_TRANSP

输入

borderValue

边界值。

border为HMPPI_BORDER_CONST时边界值

输入

pSpec

特殊结构体的指针。

非空

输入/输出

返回值

  • 成功:返回HMPP_STS_NO_ERR。
  • 失败:返回错误码。

错误码

错误码

描述

HMPP_STS_NO_OPERATION

告警,不进行操作。srcSize和dstSize中width、height存在零。

HMPP_STS_NULL_PTR_ERR

传入的任意一个指针存在空指针。

HMPP_STS_MALLOC_FAILED

pSpec初始化时内存申请失败。

HMPP_STS_SIZE_ERR

srcSize和dstSize中width、height存在负值。

示例

void WarpAffineNearestExample()
{
    double angle = 45;
    int xCenter = 1;
    int yCenter = 1;
    HmppiSize srcSize = {4, 4};
    HmppiSize dstSize = {6, 6};
    double src[] = {808.744309, 27255.923492, 14949.586917, 64065.764086, 59420.504942, 54345.804493, 2688.871018, 29176.134957, 35684.298050, 52137.708563, 15309.428011, 31545.366991, 9154.513170, 54118.967098, 34390.819908, 57073.143379};
    int dstLen = dstSize.width * dstSize.height;
    double *dst = HMPPS_Malloc_32f(dstLen);
 
    HmppiPoint dstOffset = {0, 0};
    HmppiWarpPolicy *pSpec = (HmppiWarpPolicy *)malloc(sizeof(HmppiWarpPolicy));
    double pborder = src[0];
    int smoothEdge = 0;
    double coeffs[2][3];
    HmppiWarpDirection direction = HMPP_WARP_FORWARD;
    HmppiBorderType borderType = HMPPI_BORDER_REPL;
    HmppResult result = HMPPI_WarpAffineNearestInit(srcSize, dstSize, coeffs, xCenter, yCenter, angle, direction, borderType, pborder, smoothEdge, pSpec);
    printf("result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    result = HMPPI_Set_64f_C1R(0., dst, dstSize);
    printf("result = %d\n", result);
 
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    result = HMPPI_WarpAffineNearest_64f_C1R(src, srcSize.width, dst, dstSize.width, dstOffset,  dstSize, pSpec);
    printf("result = %d\n", result);
    
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    for (int i = 0; i < dstLen; i++){
        printf("%f ", dst[i]);
    }
    HMPPI_ResizeLinearRelease_32f(pSpec);
}

运行结果:

result = 0
result = 0
result = 0
27255.923492 14949.586917 2688.871018 31545.366991 31545.366991 57073.143379 808.744309 54345.804493 15309.428011 15309.428011 57073.143379 57073.143379 59420.504942 35684.29805 52137.708563 34390.819908 34390.819908 57073.143379 35684.29805 35684.29805 9154.51317 54118.967098 34390.819908 34390.819908 35684.29805 9154.51317 9154.51317 9154.51317 54118.967098 34390.819908 9154.51317 9154.51317 9154.51317 9154.51317 9154.51317 54118.967098