opencv/python:在摄像头视频流中使用cv2掩码

4 投票
2 回答
3574 浏览
提问于 2025-04-17 13:53

大家好,我正在用我的摄像头制作一个游戏,想让一些物体从屏幕上掉下来,同时我还在用摄像头直播视频(这个视频是我的背景)。

我使用的是python和opencv的cv2模块

我的问题是:我该如何给这些物体应用一个遮罩?我已经有了一张图像作为原始图像的遮罩,但我不知道怎么用它来去掉原始图像的背景……

我已经尝试过使用cv2.bitwise_and,但没有任何效果,图像还是保持不变,背景是黑色的:

#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)

提前谢谢大家!

2 个回答

1

面具没有显示出来,是因为在面具图片名字旁边有个0这个参数。

1

如果你在使用 cv2,那么你就是在处理 numpy 数组,其实没必要去用 opencv 来做一些简单的遮罩操作。

首先,你需要对你的遮罩数组进行处理(可能是乘法),让你想要保留的部分(也就是没有被遮住的部分)值为 1。然后,把你的源图像和这个遮罩相乘。这样,得到的图像中,遮罩值为 1 的地方会保留原来的像素,而遮罩值为 0 的地方会变成黑色(也就是 0)。

大致就是这个意思:

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

根据你的 input-mask.png 的颜色深度,你可能需要先把它转换成灰度图。

撰写回答