Недокументированная ошибка изменения размера при использовании АЭС Nvidia для изменения размера изображения

Я пытаюсь использовать библиотеку приматов производительности 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,

Я определенно буду признателен за помощь, указав на любую ошибку, которую я совершаю при настройке библиотечных вызовов, вызывающих эту ошибку.

0

Решение

Глядя на пример кода 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). Я подозреваю, что в библиотеке АЭС есть недокументированное (AFAICT) требование, чтобы NPPI_INTER_SUPER Режим интерполяции не должен использоваться, когда масштабный коэффициент изменения размера равен 1,0 или больше (у вас 1,0, это отношение sourceROI / destROI).

Я предлагаю вам изучить использование в этом примере кода и применить аналогичный механизм в вашем коде.

Я уже подал запрос на обновление документации CUDA с соответствующей информацией. У меня нет никаких подробностей. Вы можете оставить свою ошибку на http://developer.nvidia.com

обновление: я подтвердил команде CUDA, что обновление документации для этого запланировано в будущем выпуске CUDA. Короче говоря, требование к использованию NPPI_INTER_SUPER это то, что вы должны делать даунскейлинг. То есть отношение измерения рентабельности инвестиций источника X, деленное на измерение рентабельности инвестиций назначения X, должно быть больше 1,0. Аналогично, отношение измерения ROI источника Y, деленное на измерение ROI назначения Y, должно быть больше 1,0. Если любое из этих условий не выполняется, NPPI_INTER_SUPER Режим интерполяции не может быть использован. Например, NPPI_INTER_LANCZOS вместо этого можно использовать режим.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]