使用 Nvidia NPP 调整图像大小时出现未记录的调整大小错误
Undocumented resize error when using Nvidia NPP to resize image
我正在尝试使用 Nvidia performance primatives 库来调整图像大小,但是 nppiResize_8u_C3R
函数抛出一个 NPP_RESIZE_FACTOR_ERROR
错误 NPP_RESIZE_FACTOR_ERROR
未在文档中列出作为错误之一 return 该函数的代码。这是我希望简单的代码:
#include <iostream>
#include <nppi.h>
int image_a_pitch;
NppiSize image_a_size = {.width = 960, .height = 540};
NppiRect image_a_roi = {.x = 0, .y = 0, .width = 960, .height = 540};
Npp8u* image_a = nppiMalloc_8u_C3(960, 540, &image_a_pitch);
int image_b_pitch;
NppiSize image_b_size = {.width = 960, .height = 540};
NppiRect image_b_roi = {.x = 0, .y = 0, .width = 960, .height = 540};
Npp8u* image_b = nppiMalloc_8u_C3(960, 540, &image_b_pitch);
NppStatus result = nppiResize_8u_C3R(image_a, image_a_pitch, image_a_size, image_a_roi, image_b, image_b_pitch, image_b_size, image_b_roi, NPPI_INTER_SUPER);
if (result != NPP_SUCCESS) {
std::cerr << "Error executing Resize -- code: " << result << std::endl;
}
您可能会注意到我实际上并没有调整图像大小,是的,确实如此,但我正在尝试为该错误创建最简单的案例。从我一直在测试的情况来看,我对图像使用什么尺寸似乎并不重要,我仍然得到相同的 return 错误代码,这似乎不是该功能的有效错误代码,而是折旧 nppiResizeSqrPixel_8u_C3R
.
的错误代码
如果能指出我在设置导致此错误的库调用时所犯的任何错误,我将不胜感激。
查看 jpegNPP CUDA 示例代码,我观察到这个序列:
NppiInterpolationMode eInterploationMode = NPPI_INTER_SUPER;
if (nScaleFactor >= 1.f)
eInterploationMode = NPPI_INTER_LANCZOS;
NPP_CHECK_NPP(nppiResize_8u_C1R(..., eInterploationMode));
}
在您的示例中,当我将插值模式从 NPPI_INTER_SUPER
切换到 NPPI_INTER_LANCZOS
时,错误消失了(CUDA 9.1,linux)。我怀疑 NPP 库中对此函数有一些未记录的(AFAICT)要求,当调整大小比例因子为 1.0 或更大时(你的是 1.0,它是 NPPI_INTER_SUPER
插值模式不被使用 sourceROI/destROI).
我建议您研究该示例代码中的用法,并在您的代码中加入类似的机制。
我已经提出请求,要求使用适当的信息更新 CUDA 文档。我没有任何进一步的细节。欢迎您在 http://developer.nvidia.com
提交您自己的错误
更新:我已经与 CUDA 团队确认,计划在未来的 CUDA 版本中对此进行文档更新。简而言之,使用 NPPI_INTER_SUPER
的要求是您必须进行降尺度。也就是说,X 源 ROI 维度除以 X 目标 ROI 维度的比率必须大于 1.0。同样,Y 源 ROI 维度除以 Y 目标 ROI 维度的比率必须大于 1.0。如果不满足其中任何一个条件,则无法使用 NPPI_INTER_SUPER
插值模式。例如,可以使用 NPPI_INTER_LANCZOS
模式。
我正在尝试使用 Nvidia performance primatives 库来调整图像大小,但是 nppiResize_8u_C3R
函数抛出一个 NPP_RESIZE_FACTOR_ERROR
错误 NPP_RESIZE_FACTOR_ERROR
未在文档中列出作为错误之一 return 该函数的代码。这是我希望简单的代码:
#include <iostream>
#include <nppi.h>
int image_a_pitch;
NppiSize image_a_size = {.width = 960, .height = 540};
NppiRect image_a_roi = {.x = 0, .y = 0, .width = 960, .height = 540};
Npp8u* image_a = nppiMalloc_8u_C3(960, 540, &image_a_pitch);
int image_b_pitch;
NppiSize image_b_size = {.width = 960, .height = 540};
NppiRect image_b_roi = {.x = 0, .y = 0, .width = 960, .height = 540};
Npp8u* image_b = nppiMalloc_8u_C3(960, 540, &image_b_pitch);
NppStatus result = nppiResize_8u_C3R(image_a, image_a_pitch, image_a_size, image_a_roi, image_b, image_b_pitch, image_b_size, image_b_roi, NPPI_INTER_SUPER);
if (result != NPP_SUCCESS) {
std::cerr << "Error executing Resize -- code: " << result << std::endl;
}
您可能会注意到我实际上并没有调整图像大小,是的,确实如此,但我正在尝试为该错误创建最简单的案例。从我一直在测试的情况来看,我对图像使用什么尺寸似乎并不重要,我仍然得到相同的 return 错误代码,这似乎不是该功能的有效错误代码,而是折旧 nppiResizeSqrPixel_8u_C3R
.
如果能指出我在设置导致此错误的库调用时所犯的任何错误,我将不胜感激。
查看 jpegNPP CUDA 示例代码,我观察到这个序列:
NppiInterpolationMode eInterploationMode = NPPI_INTER_SUPER;
if (nScaleFactor >= 1.f)
eInterploationMode = NPPI_INTER_LANCZOS;
NPP_CHECK_NPP(nppiResize_8u_C1R(..., eInterploationMode));
}
在您的示例中,当我将插值模式从 NPPI_INTER_SUPER
切换到 NPPI_INTER_LANCZOS
时,错误消失了(CUDA 9.1,linux)。我怀疑 NPP 库中对此函数有一些未记录的(AFAICT)要求,当调整大小比例因子为 1.0 或更大时(你的是 1.0,它是 NPPI_INTER_SUPER
插值模式不被使用 sourceROI/destROI).
我建议您研究该示例代码中的用法,并在您的代码中加入类似的机制。
我已经提出请求,要求使用适当的信息更新 CUDA 文档。我没有任何进一步的细节。欢迎您在 http://developer.nvidia.com
提交您自己的错误更新:我已经与 CUDA 团队确认,计划在未来的 CUDA 版本中对此进行文档更新。简而言之,使用 NPPI_INTER_SUPER
的要求是您必须进行降尺度。也就是说,X 源 ROI 维度除以 X 目标 ROI 维度的比率必须大于 1.0。同样,Y 源 ROI 维度除以 Y 目标 ROI 维度的比率必须大于 1.0。如果不满足其中任何一个条件,则无法使用 NPPI_INTER_SUPER
插值模式。例如,可以使用 NPPI_INTER_LANCZOS
模式。