Вопрос о рабочем домене INTERCAREA изменения размера OpenCV (func! = 0 && cn <= 4 в сбое функции cv :: hal :: resize) - PullRequest
2 голосов
/ 01 октября 2019

У меня есть вопрос о рабочем домене функции OpenCV resize при использовании интерполяции INTER_AREA. Вот три различных интерполяции:

import cv2
import numpy as np

cv2.resize(np.zeros((17, 99, 99), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# OK
cv2.resize(np.zeros((200, 64, 4), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# OK
cv2.resize(np.zeros((200, 64, 64), dtype=np.uint8), (64, 32), interpolation=cv2.INTER_AREA)
# error: OpenCV(4.1.1) ..\modules\imgproc\src\resize.cpp:3557: error: (-215:Assertion failed) func != 0 && cn <= 4 in function 'cv::hal::resize'

Первые два работают нормально, но последний не проходит. С чего бы это? Какая комбинация формы ввода / вывода приемлема?

(Обратите внимание, что вопрос относится только к INTER_AREA, так как другие схемы интерполяции, похоже, работают во всех трех случаях).

1 Ответ

1 голос
/ 01 октября 2019

OpenCV resize() с INTER_AREA работает только для изображений с максимум 4 каналами, когда ширина и высота старого изображения не являются целыми числами, кратными новой ширине и высоте (масштабные коэффициенты не должны быть одинаковыми для обоихширина и высота, если оба масштабных коэффициента являются целыми числами). В противном случае генерируется ошибка. К сожалению, это, кажется, не упомянуто в документации , и единственный способ узнать это - копаться в исходном коде .

Ваш первый пример работает,потому что интерполяция области используется только тогда, когда изображение сжимается (в обоих направлениях x и y). В противном случае используется билинейная интерполяция, которая не имеет этого ограничения для каналов.

...