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