使用Nvidia NPP调整图像大小时未记录的调整大小错误

时间:2018-03-21 22:25:48

标签: c++ image-processing cuda gpu npp

我试图使用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的错误代码。

我非常感谢一些帮助,指出我在设置导致此错误的库调用时遇到的任何错误。

1 个答案:

答案 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模式。