ResizeLinear
此类函数用于调整图像大小,属于图像几何变换的一类功能。
在调用ResizeLinear函数之前需要先调用Init函数进行初始化,然后调用ResizeLinear主功能函数,最后调用Release函数释放相关空间。对于Resize类函数,主要有以下三种处理方式调整图像大小:
- Init之后,调整整个图像的大小,最后Release。
- Init之后,对每一个图像块调整大小,最后Release。
- 对每个图像块进行Init,之后通过Resize主函数调整大小,最后Release。
目前仅支持双线性插值算法进行图像大小调整。
函数接口声明如下:
- 初始化函数:
HmppResult HMPPI_ResizeLinearInit_8u(HmppiSize srcSize, HmppiSize dstSize, HmppiResizePolicy_32f** policy);
- 主函数:
HmppResult HMPPI_ResizeLinear_8u_C3R(const uint8_t *src, int32_t srcStep, uint8_t *dst, int32_t dstStep, HmppiPoint dstOffset, HmppiSize dstSize, HmppiBorderType border, const uint8_t *borderValue, const HmppResizePolicy_32f *policy);
HmppResult HMPPI_ResizeLinear_8u_C4R(const uint8_t *src, int32_t srcStep, uint8_t *dst, int32_t dstStep, HmppiPoint dstOffset, HmppiSize dstSize, HmppiBorderType border, const uint8_t *borderValue, const HmppResizePolicy_32f *policy);
- 释放函数:
HmppResult HMPPI_ResizeLinearRelease_8u(HmppResizePolicy_32f *policy);
参数
参数名 |
描述 |
取值范围 |
输入/输出 |
---|---|---|---|
src |
指向源图像感兴趣区域的指针。 |
非空 |
输入 |
srcStep |
源图像中连续行起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
srcSize |
源图像块的大小。 |
正整数 |
输入 |
dst |
指向目标图像感兴趣区域的指针。 |
非空 |
输入/输出 |
dstStep |
目标图像中连续行的起点之间的距离(以字节为单位)。 |
非负整数 |
输入 |
dstOffset |
目标图像块的偏移值。 |
非负整数 |
输入 |
dstSize |
目标图像块的大小。 |
正整数 |
输入 |
border |
边界取值算法。 |
目前支持如下算法: HMPPI_BORDER_REPL HMPPI_BORDER_IN_MEM HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_BOTTOM HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_TOP HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_LEFT HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_RIGHT HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_RIGHT | HMPPI_BORDER_IN_MEM_BOTTOM HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_RIGHT | HMPPI_BORDER_IN_MEM_TOP HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_LEFT | HMPPI_BORDER_IN_MEM_BOTTOM HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_LEFT | HMPPI_BORDER_IN_MEM_TOP HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_RIGHT | HMPPI_BORDER_IN_MEM_BOTTOM | HMPPI_BORDER_IN_MEM_LEFT HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_RIGHT | HMPPI_BORDER_IN_MEM_TOP | HMPPI_BORDER_IN_MEM_BOTTOM HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_LEFT | HMPPI_BORDER_IN_MEM_BOTTOM | HMPPI_BORDER_IN_MEM_TOP HMPPI_BORDER_REPL | HMPPI_BORDER_IN_MEM_LEFT | HMPPI_BORDER_IN_MEM_TOP | HMPPI_BORDER_IN_MEM_RIGHT ER_REPL | HMPPI_BORDER_IN_MEM |
输入 |
borderValue |
边界值。 |
border为HMPPI_BORDER_CONST时边界值 |
输入 |
policy |
特殊结构体的指针。 |
非空 |
输入/输出 |
返回值
- 成功:返回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_OUT_OF_RANGE_ERR |
目标图像块偏移值比Init函数输入的目标图像块的width/height大。 |
HMPP_STS_SIZE_WRN |
目标图像块width/height比Init函数输入的目标图像块的width/height大。 |
示例
#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include "hmppi.h" #include "hmpps.h" int main () { HmppiResizePolicy_32f *policy = NULL; HmppiSize srcSize = {2, 2}; HmppiSize dstSize = {4, 4}; int32_t numChannels = 3; HmppiBorderType borderType = HMPPI_BORDER_REPL; const uint8_t borderValue = 0; HmppResult result = 0; HmppiPoint dstOffset = {0, 0}; uint8_t src[12] = {0, 255, 3, 6, 255, 0, 2, 1, 3, 4, 134, 23}; int32_t dstLen = dstSize.width * dstSize.height * numChannels; uint8_t *dst = HMPPS_Malloc_8u(dstLen); result = HMPPI_ResizeLinearInit_8u(srcSize, dstSize, &policy); printf("result = %d\n", result); int32_t srcStep = srcSize.width * numChannels * sizeof(uint8_t); int32_t dstStep = dstSize.width * numChannels * sizeof(uint8_t); result = HMPPI_ResizeLinear_8u_C3R(src, srcStep, dst, dstStep, dstOffset, dstSize, borderType, &borderValue, policy); printf("result = %d\n", result); HMPPI_ResizeLinearRelease_8u(policy); printf("free policy end\n"); for (int32_t i = 0; i < dstLen; i++) { printf("%d ", dst[i]); } printf("\n"); HMPPS_Free(dst); }
运行结果:
result = 0 result = 0 free policy end 0 255 3 2 255 2 5 255 1 6 255 0 1 192 3 2 200 4 4 216 5 6 225 6 2 65 3 2 89 7 4 139 14 5 164 17 2 1 3 3 34 8 4 101 18 4 134 23