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
減法器。
我們不能使用此方法從影象中移除背景,因為影象中不存在移動物件。