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