Search code examples
pythonopencvwebcammask

opencv/python: mask in module cv2 while streaming webcam video


Hey everyone I'm trying to make a game using my webcam where I need some objects to fall down the screen while Im streaming video with my webcam (that stream being my background).

I am using python and module cv2 of opencv

The question is: how do I apply a mask to this objects? I already have an image to be the mask of the original image but I dont know how to apply it to subtract the background of the original image..

ive already tried using the cv2.bitwise_and but nothing happened, the imaged stayed the same with black background:

#targets
original_ball = cv2.imread("Aqua-Ball-Red-icon.png")
ball = cv2.resize(bola_original, (64,64), fx=1, fy=1)
#mask
mask_original = cv2.imread("input-mask.png",0)
mask = cv2.resize(mask_original, (64,64), fx=1, fy=1)
res = cv2.bitwise_and(ball, ball, mask = mask)

Thanks in advance!


Solution

  • If you're using cv2, you're working with numpy arrays, and there's no need to turn to opencv for something as simple as a mask.

    First, manipulate (multiply, possibly) your mask array so that the values you want (i.e.: those not masked out) have value 1. Then, multiply your source image by your mask. That will make the resulting image have the original pixels where the mask == 1, and 0 (i.e.:black) where the mask == 0.

    Here's the gist of it:

    import numpy
    original_ball = cv2.imread("Aqua-Ball-Red-icon.png")
    ball = cv2.resize(bola_original, (64,64), fx=1, fy=1)
    mask_original = cv2.imread("input-mask.png",0)
    mask = cv2.resize(mask_original, (64,64), fx=1, fy=1)
    
    max_value= numpy.max(mask)
    mask/=max_value
    res= ball*mask
    

    Depending on the color depth of your input-mask.png, you may need to reduce it to grayscale first