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.0\source\modules\imgproc\src\imgwarp.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?

So it turns out that the problem comes from one line in modules\imgproc\src\imgwarp.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.

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.

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

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”

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.

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.

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

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)

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

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

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.

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)

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.

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.