OpenCV 去除背景
本教程将讨论使用 OpenCV 中的 cvzone
库、MOG2
和 KNN
从图像中删除背景。
使用 cvzone
库的 OpenCV 去除背景
我们可以使用 cvzone
库来删除使用 mediapipe
库删除背景的图像的背景。我们还可以使用它来实时删除或更改背景。
mediapipe
库提供了两种背景祛除模型,一种速度慢但准确率高,另一种速度快但准确率低。第一个模型使用 256x256x3
张量去除背景,另一个使用 144x256x3
张量。
首先,我们必须安装 cvzone
和 mediapipe
才能将它们与 OpenCV 一起使用。我们可以使用 pip
安装它们。
我们必须从 cvzone
库中导入自拍分割模块。要使用它的 removeBG()
方法,我们可以从图像中删除背景。
例如,让我们从图像中删除背景。请参阅下面的代码。
import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
segmentor = SelfiSegmentation()
img = cv2.imread("cat.jpg")
img_Out = segmentor.removeBG(img, (255, 255, 255), threshold=0.99)
cv2.imshow("img", img_Out)
cv2.waitKey(0)
cv2.destroyAllWindows()
输出:
在输出中,背景从给定图像中移除。在上面的代码中,removeBG()
函数的第一个参数是输入图像,第二个参数是我们想要用作新背景颜色的颜色。
第三个参数是我们可以根据给定图像设置的阈值。我们还可以删除或更改视频的背景。
我们必须使用循环并一一处理每一帧。我们还可以在 removeBG()
中传递背景图像而不是背景颜色来更改视频的背景。
例如,让我们更改视频的背景。请参阅下面的代码。
import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
segmentor = SelfiSegmentation()
img_b = cv2.imread("background.jpg")
capture = cv2.VideoCapture("Man.mp4")
while True:
ret, frame = capture.read()
if frame is None:
break
frame = cv2.resize(frame, [512, 512])
out = segmentor.removeBG(frame, img_b, threshold=0.6)
cv2.imshow("Frame", out)
keyboard = cv2.waitKey(30)
if keyboard == "q" or keyboard == 27:
break
cv2.destroyAllWindows()
输出:
在上面的代码中,我们使用 OpenCV 的 resize()
函数来调整帧的大小,因为帧和背景图像应该具有相同的大小。
使用 MOG2
和 KNN
的 OpenCV 去除背景
我们还可以使用 OpenCV 的减法方法,如 MOG2
和 KNN
来突出显示视频中存在的移动物体。
该算法将从视频中制作背景模型,然后从背景模型中减去图像,得到运动物体的前景蒙版。
该算法比较两帧以检查像素的位置是否改变。如果位置发生变化,像素将被添加到掩码中。
所以这个算法只能在相机静止并且物体像人或汽车一样移动的情况下使用。我们可以使用这种方法来突出显示移动物体,例如人和汽车。
例如,让我们使用 MOG2
去除背景器来突出视频中的流量。请参阅下面的代码。
import cv2
backSub_mog = cv2.createBackgroundSubtractorMOG2()
cap_v = cv2.VideoCapture("cars.mp4")
while True:
ret, frame = cap_v.read()
if frame is None:
break
fgMask = backSub_mog.apply(frame)
cv2.imshow("Input Frame", frame)
cv2.imshow("Foreground Mask", fgMask)
keyboard = cv2.waitKey(30)
if keyboard == "q" or keyboard == 27:
break
cv2.destroyAllWindows()
输出:
在上面的代码中,我们使用循环来一一获取视频的所有帧,并使用 apply()
函数应用去除背景器。我们还可以通过将上述代码中的字符从 MOG2
更改为 KNN
来使用 KNN
减法器。
我们不能使用此方法从图像中移除背景,因为图像中不存在移动对象。