【问题标题】:Undocumented resize error when using Nvidia NPP to resize image使用 Nvidia NPP 调整图像大小时出现未记录的调整大小错误
【发布时间】:2018-08-31 05:36:46
【问题描述】:

我正在尝试使用 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 的代码。

如果我在设置导致此错误的库调用时遇到任何错误,我将非常感激。

【问题讨论】:

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


    【解决方案1】:

    查看 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,它是 sourceROI/destROI 的比率)时,不使用 NPPI_INTER_SUPER 插值模式)。

    我建议您研究该示例代码中的用法,并在您的代码中放置类似的机制。

    我已经请求更新 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 模式代替。

    【讨论】:

    • 这是一个很棒的发现!我确实在 jpegNPP 示例中看到了该代码,但我从未想过这是问题所在,并且错误响应也使事情变得混乱...... NPP_RESIZE_FACTOR_ERROR 没有记录为来自 @ 的错误返回值987654330@ 系列函数,此外,它被记录为零比例或负比例错误,我没有看到会发生这种情况。
    猜你喜欢
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多