OpenCV 去除背景

Ammar Ali 2023年1月30日
  1. 使用 cvzone 库的 OpenCV 去除背景
  2. 使用 MOG2KNN 的 OpenCV 去除背景
OpenCV 去除背景

本教程将讨论使用 OpenCV 中的 cvzone 库、MOG2KNN 从图像中删除背景。

使用 cvzone 库的 OpenCV 去除背景

我们可以使用 cvzone 库来删除使用 mediapipe 库删除背景的图像的背景。我们还可以使用它来实时删除或更改背景。

mediapipe 库提供了两种背景祛除模型,一种速度慢但准确率高,另一种速度快但准确率低。第一个模型使用 256x256x3 张量去除背景,另一个使用 144x256x3 张量。

首先,我们必须安装 cvzonemediapipe 才能将它们与 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()

输出:

使用 cvzone 去除背景

在输出中,背景从给定图像中移除。在上面的代码中,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()

输出:

使用 cvzone 去除视频背景

在上面的代码中,我们使用 OpenCV 的 resize() 函数来调整帧的大小,因为帧和背景图像应该具有相同的大小。

使用 MOG2KNN 的 OpenCV 去除背景

我们还可以使用 OpenCV 的减法方法,如 MOG2KNN 来突出显示视频中存在的移动物体。

该算法将从视频中制作背景模型,然后从背景模型中减去图像,得到运动物体的前景蒙版。

该算法比较两帧以检查像素的位置是否改变。如果位置发生变化,像素将被添加到掩码中。

所以这个算法只能在相机静止并且物体像人或汽车一样移动的情况下使用。我们可以使用这种方法来突出显示移动物体,例如人和汽车。

例如,让我们使用 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()

输出:

使用 MOG2 进行去除背景

在上面的代码中,我们使用循环来一一获取视频的所有帧,并使用 apply() 函数应用去除背景器。我们还可以通过将上述代码中的字符从 MOG2 更改为 KNN 来使用 KNN 减法器。

我们不能使用此方法从图像中移除背景,因为图像中不存在移动对象。

作者: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

相关文章 - OpenCV Image