OpenCV изменение размера не удается на большом изображении с " ошибка: (-215) ssize.область ()> 0 в функции cv:: изменить размер"
Я использую OpenCV 3.0.0 и Python 3.4.3 для обработки очень большого изображения RGB (107162,79553,3). Пока я пытаюсь изменить его размер, используя следующий код:
import cv2
image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
У меня было это сообщение об ошибке:
"cv2.ошибка: C:opencv-3.0.0sourcemodulesimgprocsrcimgwarp - ... cpp: 3208: ошибка: (-215) ssize.область () > 0 в функции cv:: resize"
Я уверен, что в массиве изображений есть содержимое изображения, потому что я могу сохранить их в небольшие плитки в формате jpg. Когда я пытаюсь ... чтобы изменить размер только небольшой части изображения, нет проблем, и я получаю правильно измененное изображение. (Взятие довольно большого куска (50000,50000,3) все равно не сработает, но он будет работать на (10000,10000,3) куске)
Мне интересно, что может вызвать эту проблему и как я могу это решить?
спасибо
6 ответов
Итак, оказывается, что проблема исходит из одной строки в modules\imgproc\src\imgwarp.cpp
:
CV_Assert( ssize.area() > 0 );
когда произведение строк и столбцов изображения изменяется больше, чем 2^31, ssize.area () приводит к отрицательному числу. Это похоже на ошибку в OpenCV и, надеюсь, будет исправлено в будущем выпуске. Временное исправление-построить OpenCV с этой строкой, закомментированной. Хотя это не идеально, это работает для меня.
и я только недавно узнал, что вышесказанное относится только к изображение, ширина которого больше высоты. Для изображений с высотой больше ширины, это следующая строка, которая вызывает ошибку:
CV_Assert( dsize.area() > 0 );
Так что это также должно быть прокомментировано.
оказывается, для меня эта ошибка на самом деле говорила правду - я пытался изменить размер нулевого изображения, которое обычно было "последним" кадром видеофайла, поэтому утверждение было действительным.
теперь у меня есть дополнительный шаг перед попыткой изменения размера операции, который сделать утверждение о себе:
def getSizedFrame(width, height):
"""Function to return an image with the size I want"""
s, img = self.cam.read()
# Only process valid image frames
if s:
img = cv2.resize(img, (width, height), interpolation = cv2.INTER_AREA)
return s, img
теперь я не вижу ошибки.
для меня работала следующая работа:
- разделить массив на более мелкие суб-массивы
- изменить размер суб-массивы
- снова объединить суб массивы
вот код:
def split_up_resize(arr, res):
"""
function which resizes large array (direct resize yields error (addedtypo))
"""
# compute destination resolution for subarrays
res_1 = (res[0], res[1]/2)
res_2 = (res[0], res[1] - res[1]/2)
# get sub-arrays
arr_1 = arr[0 : len(arr)/2]
arr_2 = arr[len(arr)/2 :]
# resize sub arrays
arr_1 = cv2.resize(arr_1, res_1, interpolation = cv2.INTER_LINEAR)
arr_2 = cv2.resize(arr_2, res_2, interpolation = cv2.INTER_LINEAR)
# init resized array
arr = np.zeros((res[1], res[0]))
# merge resized sub arrays
arr[0 : len(arr)/2] = arr_1
arr[len(arr)/2 :] = arr_2
return arr
Я знаю, что это очень старая нить, но у меня была та же проблема, которая была из-за пробелов в названиях изображений.
например
имя изображения: "привет o.jpg"
странно, удаляя пробелы, функция работала просто отлично.
имя изображения: "hello_o.jpg"
оказывается, у меня был .csv-файл в конце папки, из которой я читал все изображения. Как только я удалил, что он работал нормально
убедитесь, что это все изображения и что у вас нет другого типа файла
в моем случае я сделал неправильную модификацию изображения.
я смог найти проблему, проверяющую форму изображения.
print img.shape