You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Nvidia NPP调整图像时遭遇未记录的NPP_RESIZE_FACTOR_ERROR错误

解决NPP nppiResize_8u_C3R抛出NPP_RESIZE_FACTOR_ERROR的问题

我来帮你搞定这个NPP调整图像尺寸时的诡异错误——虽然NPP_RESIZE_FACTOR_ERROR没在官方文档的返回码列表里明说,但我之前碰过类似的情况,大概率是缩放比例或者尺寸设置踩了NPP的隐性限制。下面给你拆解可能的原因和解决办法:

1. 缩放因子超出NPP的隐性范围

NPP的resize函数对缩放比例有没写在文档里的限制,一般来说缩放因子(输出尺寸/输入尺寸)不能太小(比如小于1/32,也就是0.03125)或者太大(比如超过32),否则就会触发这个错误。

你可以先手动计算一下你的缩放比例:

float scaleX = static_cast<float>(dstSize.width) / srcSize.width;
float scaleY = static_cast<float>(dstSize.height) / srcSize.height;

如果这两个值超出了0.03125 ~ 32的区间,就需要调整输出尺寸,比如先做多次缩放(比如先缩到中间尺寸,再缩到目标尺寸),或者换用其他方法处理极端比例的缩放。

2. 输出尺寸设置不合理

如果输出的width或height是0、负数,或者尺寸太小/大到超出NPP的处理能力,也会触发这个错误。确保输出尺寸是正整数,并且和输入尺寸的比例不要太极端。

3. ROI参数不匹配

虽然你给出的代码里输入ROI和输入图像尺寸是匹配的,但也要检查:

  • 输入ROI不能超出输入图像的尺寸范围
  • 输出ROI必须和输出图像的尺寸完全匹配(不能只取输出图像的一部分来做resize,除非你明确要这么做,但也要确保比例合理)

修正后的代码示例

这里给你一个完整的可参考代码,包含合理的尺寸设置和错误检查:

#include <iostream>
#include <nppi.h>

int main() {
    // 输入图像参数
    NppiSize srcSize = {960, 540};
    NppiRect srcRoi = {0, 0, 960, 540};
    int srcPitch = srcSize.width * 3; // 3通道8位图像,每个像素占3字节
    Npp8u* pSrc = nppiMalloc_8u_C3(srcSize.width, srcSize.height, &srcPitch);
    if (pSrc == nullptr) {
        std::cerr << "Failed to allocate source image memory" << std::endl;
        return -1;
    }

    // 设置合理的输出尺寸(比如0.5倍缩放)
    NppiSize dstSize = {480, 270};
    NppiRect dstRoi = {0, 0, 480, 270};
    int dstPitch = dstSize.width * 3;
    Npp8u* pDst = nppiMalloc_8u_C3(dstSize.width, dstSize.height, &dstPitch);
    if (pDst == nullptr) {
        std::cerr << "Failed to allocate destination image memory" << std::endl;
        nppiFree(pSrc);
        return -1;
    }

    // 检查缩放因子是否在合理范围
    float scaleX = static_cast<float>(dstSize.width) / srcSize.width;
    float scaleY = static_cast<float>(dstSize.height) / srcSize.height;
    std::cout << "Current scale X: " << scaleX << ", Scale Y: " << scaleY << std::endl;

    if (scaleX < 0.03125 || scaleX > 32 || scaleY < 0.03125 || scaleY > 32) {
        std::cerr << "Error: Scale factor is out of NPP's supported range!" << std::endl;
        nppiFree(pSrc);
        nppiFree(pDst);
        return -1;
    }

    // 调用resize函数(这里用双线性插值,你可以换成需要的插值方式)
    NppStatus status = nppiResize_8u_C3R(
        pSrc, srcPitch, srcSize, srcRoi,
        pDst, dstPitch, dstSize, dstRoi,
        NPPI_INTER_LINEAR
    );

    if (status != NPP_SUCCESS) {
        std::cerr << "Resize failed with status code: " << status << std::endl;
        if (status == NPP_RESIZE_FACTOR_ERROR) {
            std::cerr << "Detailed error: Invalid resize factor (check scale or size settings)" << std::endl;
        }
    } else {
        std::cout << "Image resizing completed successfully!" << std::endl;
    }

    // 释放内存
    nppiFree(pSrc);
    nppiFree(pDst);
    return 0;
}

额外排查点

  • 确认你的NPP库版本,有些旧版本对缩放因子的限制更严格,升级到最新版可能解决问题
  • 确保你已经正确初始化了CUDA环境,比如调用cudaSetDevice(0)指定要使用的GPU设备

内容的提问来源于stack exchange,提问作者Jason

火山引擎 最新活动