image opencv python-3.x image-processing opencv3.0

El cambio de tamaño de OpenCV falla en una imagen grande con "error:(-215) ssize.area()> 0 en la función cv:: resize"



python-3.x image-processing (7)

Así que resulta que el problema proviene de una línea en modules/imgproc/src/imgwarp.cpp :

CV_Assert( ssize.area() > 0 );

Cuando el producto de las filas y columnas de la imagen que se va a redimensionar es mayor que 2 ^ 31, ssize.area () produce un número negativo. Esto parece ser un error en OpenCV y es de esperar que se solucione en el futuro lanzamiento. Una solución temporal es construir OpenCV con esta línea comentada. Si bien no es ideal, funciona para mí.

Y recientemente descubrí que lo anterior se aplica solo a la imagen cuyo ancho es mayor que la altura. Para imágenes con una altura mayor que el ancho, es la siguiente línea la que causa el error:

CV_Assert( dsize.area() > 0 );

Así que esto también tiene que ser comentado.

Estoy usando OpenCV 3.0.0 y Python 3.4.3 para procesar una imagen RGB muy grande (107162,79553,3). Mientras estoy tratando de redimensionarlo usando el siguiente código:

import cv2 image = cv2.resize(img, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)

Recibí este mensaje de error:
"cv2.error: C: / opencv-3.0.0 / source / modules / imgproc / src / imgwarp.cpp: 3208: error: (-215) ssize.area ()> 0 en la función cv :: resize"

Estoy seguro de que hay un contenido de imagen en la matriz de imágenes porque puedo guardarlos en mosaicos pequeños en formato jpg. Cuando intento cambiar el tamaño de una pequeña parte de la imagen, no hay ningún problema y termino con el tamaño correcto de la imagen. (Tomar un trozo bastante grande (50000,50000,3) todavía no funcionará, pero funcionará en un trozo (10000,10000,3))

Me pregunto qué podría causar este problema y cómo puedo resolverlo.

Gracias


En mi caso hice una modificación incorrecta en la imagen.

Pude encontrar el problema al verificar la forma de la imagen.

print img.shape


Para mí el siguiente trabajo trabajado:

  • dividir la matriz en sub matrices más pequeñas
  • cambiar el tamaño de las matrices de sub
  • fusionar las matrices de sub de nuevo

Aquí el código:

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


Resulta que para mí, este error fue en realidad la verdad: estaba tratando de cambiar el tamaño de una imagen nula, que generalmente era el marco ''último'' de un archivo de video, por lo que la afirmación era válida.

Ahora tengo un paso adicional antes de intentar la operación de cambio de tamaño, que es hacer la aserción yo mismo:

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

Ahora no veo el error.


Resulta que tenía un archivo .csv al final de la carpeta en la que estaba leyendo todas las imágenes. Una vez borré eso funcionó bien.

Asegúrese de que se trata de todas las imágenes y de que no tiene ningún otro tipo de archivo


Sé que este es un hilo muy antiguo pero tuve el mismo problema que se debía a los espacios en los nombres de las imágenes.

p.ej

Nombre de la imagen: "hola o.jpg"

Extrañamente, al eliminar los espacios, la función funcionó bien.

Nombre de la imagen: "hello_o.jpg"


También preste atención al tipo de objeto de su matriz numpy, convirtiéndolo usando .astype(''uint8'') resolví el problema por mí.