0

I am getting an error about broadcasting an input array from shape. Normally, this seems to be caused by converting some array of dimension p into some array of dimension: p+1 or p-1. However, the shapes of my input and output seems to be the same: 3 dimensions. So my question is, what am I doing wrong and how do I go about addressing this issue?

ValueErrorTraceback (most recent call last)
<ipython-input-21-e821b7e8e0de> in <module>()
    108                   "overlay_glasses.shape: ", overlay_glasses.shape)
    109 
--> 110             overlay_img[int(y):int(y+h),int(x):int(x+w)] = overlay_glasses
    111 

The following are the output of print statements, to give a better understanding of the above code.

'overlay_img.shape: '    , (365, 365, 3), 
'overlay_glasses.shape: ', ( 34,  99, 3)
'x: ', 623.26, 'y: ', 265.9
'h: ', 34, 'w: ', 99

larger code snippet:

[omitted code here]
if len(centers)>0:
    # change the given value of 2.15 according to the size of the detected face
    glasses_width = 2.16*abs(centers[1][0]-centers[0][0])
    overlay_img = np.ones(shape = roi_color.shape,
                          dtype = np.uint8)*255
    h,w = glass_img.shape[:2]
    scaling_factor = glasses_width/w
    overlay_glasses = cv2.resize(src           = glass_img,
                                 dsize         = None,
                                 fx            = scaling_factor, # scale factor along x-axis; when it equals 0, it is computed as \texttt{(double)dsize.width/src.cols}
                                 fy            = scaling_factor, # scale factor along y-axis
                                 interpolation = cv2.INTER_AREA) # INTER_AREA: resampling using pixel area relation. It may be a preferred method for image decimation,

    x = centers[0][0] if centers[0][0] < centers[1][0] else centers[1][0]

    #   The x and y variables  below depend upon the size of the detected face.
    x   -=  0.26*overlay_glasses.shape[1]
    y   +=  0.85*overlay_glasses.shape[0]
    print("x: ", x,
          "y: ", y)

    #slice the height, width of the overlay image.
    h,  w   =   overlay_glasses.shape[:2]

    print("h: ", h,
          "w: ", w)

    print("overlay_img.shape: ", overlay_img.shape,
          "overlay_glasses.shape: ", overlay_glasses.shape)

    overlay_img[int(y):int(y+h),int(x):int(x+w)] = overlay_glasses # this is the offending line of code
3
  • Try printing the shape of overlay_img[int(y):int(y+h),int(x):int(x+w)]. Commented Jun 23, 2018 at 20:49
  • What's the exact error you are getting? Commented Jun 23, 2018 at 20:49
  • You can't fill up (34, 0, 3) with (34, 99, 3). Commented Jun 23, 2018 at 20:52

1 Answer 1

2

Your x is out of range to create a subimage for the overlay_img you have provided. The dimensions of your image are (365, 365, 3), but you provide x to be 623 and x+w to be 722. This creates an empty subimage which cannot be filled with the overlay_glasses's contents. Obviously there is something wrong with the x coordinate.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.