I am trying to overlay an image of a hat over the head in a webcam feed and I get the error in the following line -
hat = cv2.resize(imghat, (hatWidth,hatHeight), interpolation = cv2.INTER_AREA)
The program runs, but quickly exits and gives the above error. The code segment is given below -
# Create the mask for the hat
imghatGray = cv2.cvtColor(imghat, cv2.COLOR_BGR2GRAY)
#cv2.imwrite("imghatGray.png", imghatGray)
ret, orig_mask = cv2.threshold(imghatGray, 0, 255, cv2.THRESH_BINARY)
#cv2.imwrite("orig_mask.png", orig_mask)
# Create the inverted mask for the hat
orig_mask_inv = cv2.bitwise_not(orig_mask)
#cv2.imwrite("orig_mask_inv.png", orig_mask_inv)
# Convert hat image to BGR
# and save the original image size (used later when re-sizing the image)
imghat = imghat[:,:,0:3]
orighatHeight, orighatWidth = imghat.shape[:2]
video_capture = cv2.VideoCapture(0)
while True:
ret, frame = video_capture.read()
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
faces = face_cascade.detectMultiScale(gray, 1.3, 5, flags=cv2.cv.CV_HAAR_SCALE_IMAGE)
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x,y), (x+w, y+h), (255,0,0), 2)
roi_gray = gray[y:y+h, x:x+w]
roi_color = frame[y:y+h, x:x+w]
hatWidth = w
hatHeight = hatWidth * orighatHeight / orighatWidth
# Center the hat
x1 = x -15
x2 = x + hatWidth + 15
y1 = y - hatHeight
y2 = y + 15
# Check for clipping
if x1 < 0:
x1 = 0
if y1 < 0:
y1 = 0
if x2 > w:
x2 = w
if y2 > h:
y2 = h
cv2.rectangle(frame, (x1,y1), (x2, y2), (0,255,0), 2)
# Re-calculate the width and height of the hat image
hatWidth = x2 - x1
hatHeight = y2 - y1
# Re-size the original image and the masks to the hat sizes
# calcualted above
hat = cv2.resize(imghat, (hatWidth,hatHeight), interpolation = cv2.INTER_AREA)
mask = cv2.resize(orig_mask, (hatWidth,hatHeight), interpolation = cv2.INTER_AREA)
mask_inv = cv2.resize(orig_mask_inv, (hatWidth,hatHeight), interpolation = cv2.INTER_AREA)
# take ROI for hat from background equal to size of hat image
roi = roi_color[y1:y2, x1:x2]
# roi_bg contains the original image only where the hat is not
# in the region that is the size of the hat.
roi_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)
# roi_fg contains the image of the hat only where the hat is
roi_fg = cv2.bitwise_and(hat,hat,mask = mask)
# join the roi_bg and roi_fg
dst = cv2.add(roi_bg,roi_fg)
# place the joined image, saved to dst back over the original image
roi_color[y1:y2, x1:x2] = dst
break
This is the error message shown -
v2.error: /home/vinravun/opencv-2.4.10/modules/core/src/matrix.cpp:116: error: (-215) s >= 0 in function setSize
There are not enough details to tell, but it seems that one of the images that you are trying to resize is empty.
Do you know on which of the resize lines this error is happening?
You should probably check after you grab the webcam image if it has any content.