Подтвердить что ты не робот

Изменение размера OpenCV на большом изображении с ошибкой: (-215) ssize.area()> 0 в функции 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: error: (-215) ssize.area() > 0 в функции cv:: resize"

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

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

Спасибо

4b9b3361

Ответ 1

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

CV_Assert( ssize.area() > 0 );

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

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

CV_Assert( dsize.area() > 0 );

Так что это тоже нужно прокомментировать.

Ответ 2

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

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

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

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

Ответ 3

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

например.

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

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

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

Ответ 4

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

Ответ 5

Для меня работала следующая работа:

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

Здесь код:

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

Ответ 6

У меня 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)    

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

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

print img.shape

Ответ 10

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

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

Ответ 11

Вы можете вручную поставить чек в своем коде. Вот так -


    if result != []:
        for face in result:
            bounding_box = face['box']
            x, y, w, h = bounding_box[0], bounding_box[1], bounding_box[2], bounding_box[3]
            rect_face = cv2.rectangle(frame, (x, y), (x+w, y+h), (46, 204, 113), 2)
            face = rgb[y:y+h, x:x+w]

            #CHECK FACE SIZE (EXIST OR NOT)
            if face.shape[0]*face.shape[1] > 0:

                predicted_name, class_probability = face_recognition(face)

                print("Result: ", predicted_name, class_probability)
'