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