我试图使用Nvidia性能灵长类动画库来调整图像大小,但nppiResize_8u_C3R
函数正在抛出一个未在文档中列出的NPP_RESIZE_FACTOR_ERROR
作为错误返回之一该功能的代码。这是我希望简单的代码:
#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;
}
你可能会注意到我实际上没有调整图像的大小,是的,这是真的,但我试图为这个错误创建最简单的情况。从我正在测试的内容来看,对于我用于图像的大小似乎并不重要,我仍然得到相同的返回错误代码,这似乎不是该函数的有效错误代码,而是折旧nppiResizeSqrPixel_8u_C3R
的错误代码。
我非常感谢一些帮助,指出我在设置导致此错误的库调用时遇到的任何错误。
答案 0 :(得分:2)
查看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或更高时,不使用NPPI_INTER_SUPER
插值模式(你的是1.0,它是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
模式。