Если вы посмотрите в коде cv :: remap, вы увидите следующую проверку совместимых типов данных с типами интерполяции:
static RemapNNFunc nn_tab[] =
{
remapNearest<uchar>, remapNearest<schar>, remapNearest<ushort>, remapNearest<short>,
remapNearest<int>, remapNearest<float>, remapNearest<double>, 0
};
static RemapFunc linear_tab[] =
{
remapBilinear<FixedPtCast<int, uchar, INTER_REMAP_COEF_BITS>, RemapVec_8u, short>, 0,
remapBilinear<Cast<float, ushort>, RemapNoVec, float>,
remapBilinear<Cast<float, short>, RemapNoVec, float>, 0,
remapBilinear<Cast<float, float>, RemapNoVec, float>,
remapBilinear<Cast<double, double>, RemapNoVec, float>, 0
};
Таким образом, несмотря на то, что тип со знаком в знаке разрешен для интерполяции ближайшего соседа, это не относится к билинейной интерполяции. Все комбинации не реализованы.
IPP (библиотека Intel для обработки изображений), которую можно использовать с OpenCV, также не допускает операции со знаком со знаком: https://software.intel.com/en-us/ipp-dev-reference-remap. В моем понимании, Intel не предоставляет такие реализации, когда они не имеют смысла в терминах производительности (т. е. они не предоставляют функцию, которая преобразует 8-е в 16-е внутри функции, вычисляет что-то и конвертирует обратно в 8-е). Кроме того, поддержка всех комбинаций типов данных, типов интерполяции и количества каналов, безусловно, требует некоторой работы, поэтому также хорошо сосредоточиться на наиболее используемых типах.
Если у вас нет узкого места в производительности, которое абсолютно необходимо для работы с целыми числами, я бы порекомендовал конвертировать в float. Также с целыми числами вы должны заботиться о количественном определении.
Когда вы получаете "утверждать" ошибки, это обычно происходит потому, что вы не выполняете ожидаемые / реализованные входные типы данных или формы (размер изображения / количество каналов).
Надеюсь, это поможет!