it-swarm.com.ru

Изменение размера OpenCV завершается неудачно на большом изображении с "ошибкой: (-215) ssize.area ()> в функции cv :: resize"

Я использую 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.error: C:\opencv-3.0.0\source\modules\imgproc\src\imgwarp.cpp: 3208: ошибка: (-215) ssize.area ()> 0 в функции cv :: resize "

Я уверен, что в массиве изображений есть содержимое изображения, потому что я могу сохранить их в виде маленьких плиток в формате jpg. Когда я пытаюсь изменить размер только небольшой части изображения, нет проблем, и я получаю правильно измененное изображение. (Взятие довольно большого фрагмента (50000,50000,3) по-прежнему не будет работать, но оно будет работать с (10000,10000,3) фрагментом) 

Мне интересно, что может вызвать эту проблему и как я могу решить эту проблему? 

Спасибо

20
user3667217

Так что получается, что проблема исходит из одной строки в modules\imgproc\src\imgwarp.cpp:

CV_Assert( ssize.area() > 0 );

Если произведение строк и столбцов изменяемого изображения больше 2 ^ 31, ssize.area () приводит к отрицательному числу. Это похоже на ошибку в OpenCV и, надеюсь, будет исправлено в следующем выпуске. Временное исправление - сборка OpenCV с закомментированной строкой. Хотя это и не идеально, это работает для меня. 

И я только недавно узнал, что вышесказанное относится только к изображению, ширина которого больше высоты. Для изображений с высотой, превышающей ширину, следующая строка вызывает ошибку: 

CV_Assert( dsize.area() > 0 );

Так что это тоже должно быть закомментировано. 

19
user3667217

Оказывается, для меня эта ошибка на самом деле говорила правду - я пытался изменить размер пустого изображения, которое обычно было «последним» кадром видеофайла, поэтому утверждение было верным. 

Теперь у меня есть дополнительный шаг перед попыткой операции изменения размера, которая заключается в том, чтобы сделать утверждение самостоятельно:

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

Теперь я не вижу ошибки.

6
Kelton.Temby

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

например.

Название изображения: "привет o.jpg"

странно, удалив пробелы, функция работала просто отлично.

Название изображения: "hello_o.jpg"

2
Wanderer

Для меня работал следующий обходной путь:

  • разбить массив на меньшие подмассивы
  • изменить размер массивов
  • снова объединить вложенные массивы

Вот код:

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
1
Oli Blum

Оказывается, у меня был файл .csv в конце папки, из которой я читал все изображения .... Как только я удалил, все работает нормально

Убедитесь, что это все изображения и у вас нет другого типа файла

0
empoleonrocks

Также обратите внимание на тип объекта вашего массива numpy, преобразование его с помощью .astype('uint8') решило проблему для меня.

0
Attila

Я работал с 3 файлами: сценарий Python, изображение и обученная модель.

Все работало, когда я переместил эти 3 файла в их собственную папку вместо каталога с другими скриптами на python.

0
Shane Rooney

У меня OpenCV версии 3.4.3 на MacOS . Я получаю ту же ошибку, что и выше.

Я изменил свой код с

frame = cv2.resize(frame, (0,0), fx=0.5, fy=0.5)   

в

frame = cv2.resize(frame, None, fx=0.5, fy=0.5)    

Теперь это работает нормально для меня.

0
Biranchi

В моем случае я сделал неправильную модификацию изображения.

Мне удалось найти проблему проверки формы изображения.

print img.shape
0
Thomio