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

ResizeCubic

用于调整图像大小,使用双参数三次插值算法,属于图像几何变换的一类功能。

在调用ResizeCubic函数之前需要先调用Init函数进行初始化,然后调用ResizeCubic主功能函数,最后调用Release函数释放相关空间。

函数接口声明如下:

  • 初始化函数:

    HmppResult HMPPI_ResizeCubicInit_32f(HmppiSize srcSize, HmppiSize dstSize, float B, float C, HmppiResizePolicy_32f** pSpec);

  • 主函数:

    HmppResult HMPPI_ResizeCubic_32f_C1R(const float* pSrc, int32_t srcStep, float* pDst, int32_t dstStep, HmppiPoint dstOffset, HmppiSize dstSize, HmppiBorderType border, const float* pBorderValue, const HmppiResizePolicy_32f* pSpec);

  • 释放函数:

    HmppResult HMPPI_ResizeCubicRelease_32f(HmppiResizePolicy_32f *policy);

参数

参数名

描述

取值范围

输入/输出

pSrc

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

非空

输入

srcStep

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

非负整数

输入

srcSize

源图像块的大小。

正整数

输入

pDst

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

非空

输入/输出

dstStep

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

非负整数

输入

dstOffset

目标图像块的偏移值。

非负整数

输入

dstSize

目标图像块的大小。

正整数

输入

B

三次滤波器的第一个参数。

实数

输入

C

三次滤波器的第二个参数。

实数

输入

border

边界取值算法。

目前支持如下算法:

HMPPI_BORDER_REPL

HMPPI_BORDER_MIRROR

HMPPI_BORDER_MIRROR_R

输入

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

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

HMPP_STS_SIZE_ERR

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

或srcSize小于2x2。

HMPP_STS_BORDER_ERR

边界算法类型不支持。

HMPP_STS_STEP_ERR

  • srcStep或dstStep不是float字节长度的整数倍。
  • srcStep或dstStep小于srcwidth或dstwidth乘以float字节长度。

HMPP_STS_OUT_OF_RANGE_ERR

目标图像块偏移值比Init函数输入的目标图像块的width/height大。

HMPP_STS_SIZE_WRN

目标图像块width/height比Init函数输入的目标图像块的width/height大。

示例

void ResizeCubicExample()
{
    HmppiSize srcSize = {4, 4};
    HmppiSize dstSize = {6, 6};
    HmppiPoint dstOffset = {0, 0};
    int srcStep = srcSize.width * sizeof(float);
    int dstStep = dstSize.width * sizeof(float);
    HmppiResizePolicy_32f *pSpec; 
    float pSrc[] = {0.0, 255.0, 3.0, 6.0, 255.0, 0.0, 2.0, 1.0, 3.0,
            0.0, 255.0, 3.0, 6.0, 255.0, 0.0, 2.0};
    int dstLen = dstSize.width * dstSize.height;
    float *pDst = HMPPS_Malloc_32f(dstLen);
    double B = 0.5;
    double C = 0.5;
    HmppResult result = HMPPI_ResizeCubicInit_32f(srcSize, dstSize, B, C, &pSpec);
    HmppiBorderType border = HMPPI_BORDER_REPL;
    float borderValue = pSrc[0];
    result = HMPPI_ResizeCubic_32f_C1R(pSrc, srcStep, pDst, dstStep, dstOffset, dstSize, border, &borderValue, pSpec);
 
    printf("result = %d\n", result);
    if (result != HMPP_STS_NO_ERR) {
        return;
    }
    for (int i = 0; i < dstLen; i++){
        printf("%f ", pDst[i]);
    }
    printf("\n");
    HMPPI_ResizeCubicRelease_32f(pSpec);
}

运行结果:

result = 0
-4.966425 140.752594 205.351364 60.469444 -8.723660 6.077533 140.751587 141.259216 97.576118 18.680174 -10.837348 3.531568 205.383133 95.673416 7.140303 43.515594 33.608219 0.835248 60.508411 16.424671 41.026234 159.661621 113.710358 0.589375 -9.937934 58.751194 133.184296 140.705246 72.326935 1.272445 3.603872 145.281662 204.080536 56.064888 -13.772015 2.033274