Изменение размера 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)
Мне интересно, что может вызвать эту проблему и как я могу это решить?
Спасибо
Ответы
Ответ 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)
'