Как обработать ошибку в CV2 (Cv2.imwrite)?

#python #python-3.x #opencv #error-handling #opencv-python

#python #python-3.x #opencv #обработка ошибок #opencv-python

Вопрос:

Я пытаюсь устранить ошибку, которую продолжает выдавать cv2.imwrite, она продолжает доставать точно такое же изображение в папке, а затем говорит «-215: ошибка утверждения» в строке cv2.imwrite, и мне не очень везет с написанием отказоустойчивых систем для такого типа ошибок, она читается правильно, поэтому я понятия не имею, почему она не записывается. Я пробовал эти два метода:

         writeStatus = cv2.imwrite('output/'  i, cropped)
        if writeStatus is True:
            print('Image Written')
        else:
            print('Error saving photo')
            cv2.imwrite('rejected/'  i, image)
  
         if cv2.imwrite('output/'  i, cropped) == True:
            print('Image write succeeded')
        else:
            if cv2.imwrite('rejected/'  i, image)== True:
                print ('Cropped image could not be written, sent to rejects')
            else:
                print('writing error, script stopped')
                break
  

Я понятия не имею, почему он не сохранит изображение, похоже, что пока он ненавидит только это конкретное, даже если изображение одно в папке, оно не будет его записывать, честно говоря, мне все равно, пока я могу выводить подобные изображения в папку reject вместо того, чтобы это убивало весь скрипт.
РЕДАКТИРОВАТЬ Я пытался использовать

         writeStatus = cv2.imwrite('output/'  i, cropped)
        if writeStatus is True:
            print('Image Written')
        else:
            print('Error saving photo')
            continue
  

и ошибка все равно остановила скрипт

Комментарии:

1. вы пытаетесь сохранить пустое изображение. Проверьте, почему «обрезанный» является пустым

2. Я понятия не имею, почему он пустой, он отлично обрабатывает изображение, пока не попадет в команду imwrite. Насколько я могу судить, ничто не должно возвращать значения None.

3. @Miki Я добавил проверку, чтобы убедиться, что значения обрезки не равны None или 0, и они были в порядке, прошел проверку, а затем выдал ту же ошибку

Ответ №1:

Предложение # 1


Если мы посмотрим на инструкцию:

 writeStatus = cv2.imwrite('output/'  i, cropped)
  

'output/' i предполагается, что это имя изображения, а обрезанное должно быть изображением.

Насколько я понимаю, вы хотите сохранить i -е значение, но правильный способ:

 from os.path import join

filename = join('output', str(i)   '.png') # you can use other extensions like .jpg
cv2.imwrite(filename, cropped)
  

Но это верно, если cropped переменная является изображением.

Предложение # 2


Если проблема возникает из-за одного изображения, а вам все равно, вы могли бы использовать try-except block и continue ключевое слово

 try:
    writeStatus = cv2.imwrite(...)
    .
    .
except:
    continue
  

Комментарии:

1. Однако почему это может вызвать ошибку только для одного изображения? Все остальные изображения работают нормально. вывод / — это путь к файлу, у меня есть исходное имя файла, сохраненное в переменной i.

2. Только для одного изображения? затем вы можете использовать continue ключевое слово, чтобы пропустить изображение.

3. Пытался использовать ключевое слово continue с writeStatus, чтобы, если writeStatus было false, это запускало бы continue, не повезло, ошибка по-прежнему останавливала скрипт.

4. Я обновил свой ответ, пожалуйста, посмотрите на часть предложения № 2

5. Хорошо, это работает, я добавил функцию для вывода проблемного изображения в отдельную папку, и это сработало как по волшебству. Не уверен, почему оператор true false не работает, из того, что я могу сказать, cv2.imwrite должен выводить true или false, потому что функция записи изображения печати работает, если это true. Для меня это загадка.