[英]Nvidia NPP nppiFilter produces garbage when convolving with 2d kernel
[英]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_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
模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.