簡體   English   中英

使用Nvidia NPP調整圖像大小時出現未記錄的調整大小錯誤

[英]Undocumented resize error when using Nvidia NPP to resize image

我正在嘗試使用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代碼。

我非常感謝您提供一些幫助,指出我在設置引起此錯誤的庫調用時遇到的任何錯誤。

查看jpegNPP CUDA示例代碼,我觀察到以下順序:

    NppiInterpolationMode eInterploationMode = NPPI_INTER_SUPER;

    if (nScaleFactor >= 1.f)
        eInterploationMode = NPPI_INTER_LANCZOS;

    NPP_CHECK_NPP(nppiResize_8u_C1R(..., eInterploationMode));
}

在您的示例中,當我將插值模式從NPPI_INTER_SUPERNPPI_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模式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM