OpenCV resize fails on large image with "error: (-215) ssize.area() > 0 in function cv::resize"

Question:

I’m using OpenCV 3.0.0 and Python 3.4.3 to process a very large RGB image (107162,79553,3). While I’m trying to resize it using the following code:

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

I had this error message coming up:

cv2.error: C:opencv-3.0.0sourcemodulesimgprocsrcimgwarp.cpp:3208: error: (-215) ssize.area() > 0 in function cv::resize

I’m certain there is image content in the image array because I can save them into small tiles in jpg format. When I try to resize just a small part of the image, there is no problem and I end up with correctly resized image. (Taking a rather big chunk (50000,50000,3) still won’t work, but it will work on a (10000,10000,3) chunk)

What could cause this problem and how can I solve this?

Asked By: user3667217

||

Answers:

So it turns out that the problem comes from one line in modulesimgprocsrcimgwarp.cpp:

CV_Assert( ssize.area() > 0 );

When the product of rows and columns of the image to be resized is larger than 2^31, ssize.area() results in a negative number. This appears to be a bug in OpenCV and hopefully will be fixed in the future release. A temporary fix is to build OpenCV with this line commented out. While not ideal, it works for me.

And I just recently found out that the above applies only to image whose width is larger than height. For images with height larger than width, it’s the following line that causes error:

CV_Assert( dsize.area() > 0 );

So this has to be commented out as well.

Answered By: user3667217

Turns out for me this error was actually telling the truth – I was trying to resize a Null image, which was usually the ‘last’ frame of a video file, so the assertion was valid.

Now I have an extra step before attempting the resize operation, which is to do the assertion myself:

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

Now I don’t see the error.

Answered By: Kelton Temby

For me the following work-around worked:

  • split the array up into smaller sub arrays
  • resize the sub arrays
  • merge the sub arrays again

Here the code:

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
Answered By: Oliver Wilken

I know this is a very old thread but I had the same problem which was due spaces in the images names.

e.g.

Image name: “hello o.jpg”

weirdly, by removing the spaces the function worked just fine.

Image name: “hello_o.jpg”

Answered By: Wanderer

Turns out I had a .csv file at the end of the folder from which I was reading all the images.
Once I deleted that it worked alright

Make sure that it’s all images and that you don’t have any other type of file

Answered By: empoleonrocks

In my case I did a wrong modification in the image.

I was able to find the problem checking the image shape.

print img.shape
Answered By: Thomio

Also pay attention to the object type of your numpy array, converting it using .astype('uint8') resolved the issue for me.

Answered By: Attila

I am having OpenCV version 3.4.3 on MacOS.
I was getting the same error as above.

I changed my code from

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

to

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

Now its working fine for me.

Answered By: Biranchi

I was working with 3 files: The python script, the image, and the trained model.

Everything worked when I moved these 3 files into their own folder instead of in the directory with the other python scripts.

Answered By: Shane Rooney

This type of error also takes place because the resize is unable to get the image in simple
the directory of the image may be wrong.In my case I left the forward slash during providing the location of file and this error took place after I put the slash problem was solved.

Answered By: darkemperorVKO

You can manually place a check in your code. Like this:

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)
Answered By: Niyaz B. Hashem

I had the same error. Resizing the images resolved the issue. However, I used online tools to resize the images because using pillow to resize them did not solve my problem.

Answered By: Solomon Fissehaye

In my case,

image = cv2.imread(filepath)
final_img = cv2.resize(image, size_img)

filepath was incorrect, cv2.imshow didn’t give any error in this case but due to wrong path cv2.resize was giving me error.

Answered By: Parth Dodiya

I came across the same error message while I was trying to enlarge the image size. Assigning the image type as uint8 did the work for me and I was able to resize the image 30 times of its original size. Here is an example as a reference for anyone else who has such issue.

scale_percent = 3000
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent /100)

dim = (width, height)
image = cv2.resize(img.astype('uint8'), dim, interpolation=cv2.INTER_AREA)
Answered By: paintthatagain

Same error message for me but issue was different:

The interpolation method ‘INTER_AREA’ was NOT compatible with int8 !

enter image description here

Answered By: Ludo Schmidt
cv2.resize(frame_rgb, tuple([None, None]))

gives similar error. Notice the None values in the resizing tuple.

Answered By: Mihai.Mehe

In my case there were some corrupt or not supported images. What i simple did is just check if it is not None than process it as shown below.

cv2.imread(image_path)
if img is not None:
    cv2.resize(img,(150,150)) # You can give your own desired image size
Answered By: Bilal Ahmed