一文教你使用OpenCV+CVzone進行實時背景替換
介紹OpenCV是一個開源計算機視覺庫,可提供播放不同圖像和視頻流的權(quán)限,還有助于端到端項目,如對象檢測、人臉檢測、對象跟蹤等。CVzone是一個計算機視覺包,可以讓我們輕松運行像人臉檢測、手部跟蹤、姿勢估計等,以及圖像處理和其他 AI 功能。它的核心是使用 OpenCV 和 MediaPipe 庫。
為什么需要實時背景去除?
由于許多原因,視頻的背景需要修改,如背景中有很多其他中斷或背景顏色不適合該人。因此,我們使用實時背景替換技術(shù)來替換背景并添加替換為所需內(nèi)容。
流行的背景去除技術(shù)
圖像剪切路徑 - 如果圖像的主題具有銳利的邊緣,則使用此技術(shù)。所有落在路徑之外的元素都將被消除。
圖像剪切 – 在這里,我們剪切幀中所需的區(qū)域或主題并刪除背景。
圖像遮罩 – 如果圖像有褶邊或細邊緣,我們可以使用圖像遮罩技術(shù)。
擦除背景 – 使用任何不同的工具擦除圖像的背景許多著名的應(yīng)用程序使用背景去除技術(shù)并用自定義技術(shù)替換它。在這里,我們將實現(xiàn)類似的東西,使用 OpenCV 和 CVzone。
讓我們開始實施
安裝所需的模塊。
-- pip install OpenCV-python
-- pip install cvzone
-- pip install mediapipe
首先,讓我們檢查一下我們的網(wǎng)絡(luò)攝像頭是否工作正常。import cv2
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
while True:
success, img = cap.read()
cv2.imshow("Image", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
如果你有網(wǎng)絡(luò)攝像頭,上面的代碼會彈出一個窗口,這里的幀大小是 640 X 480。所以我們需要注意,因為背景替換圖像的大小應(yīng)該與幀大小相同,即 640 X 480 .
現(xiàn)在在這里創(chuàng)建項目目錄中的文件夾,我正在創(chuàng)建一個名為*'BackgroundImages'*的文件夾。你可以下載任何圖像或任意數(shù)量的圖像并將它們放在此目錄中。項目結(jié)構(gòu)將如下圖所示:
讓我們在單獨的 python 文件中編寫一小段代碼,將*“BackgroundImages”*文件夾中的所有圖像大小調(diào)整 為 640 X 480。import cv2
import os
for root, subdirs, files in os.walk('D:/pycharmprojects/BackgroundRemover/BackgroundImages'):
for f in files:
if f.endswith('jpg'):
# print(f)
img = cv2.imread('D:/pycharmprojects/BackgroundRemover/BackgroundImages/' + f)
img = cv2.resize(img, (640, 480))
cv2.imwrite('D:/pycharmprojects/BackgroundRemover/BackgroundImages/'+f, img)
print(*["Image", f, "is resized to 640 X 480"])
上面的代碼將讀取指定文件夾中的圖像(jpg)文件,并一次將所有圖像調(diào)整為 640 X480。調(diào)整所有圖像大小后的輸出
現(xiàn)在我們都準(zhǔn)備好實現(xiàn)背景替換技術(shù)了。導(dǎo)入需要的模塊import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
import os
在上面的模塊中,*“SelfSegmentation”*用于刪除框架的背景并將其替換為我們目錄中的圖像。cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
# cap.set(cv2.CAP_PROP_FPS, 60)
segmentor = SelfiSegmentation()
fpsReader = cvzone.FPS()
# imgBG = cv2.imread("BackgroundImages/3.jpg")
listImg = os.listdir("BackgroundImages")
imgList = []
for imgPath in listImg:
img = cv2.imread(f'BackgroundImages/{imgPath}')
imgList.a(chǎn)ppend(img)
indexImg = 0
在上面的代碼中,我們采取從網(wǎng)絡(luò)攝像頭輸入,并且還設(shè)置幀寬度為640 X 480然后調(diào)用SelfiSegmentation() ,并將其分配給一個變量segmentor,并且為了在顯示幀每秒(fps)的輸出幀,我們使用*cvzone.FPS()*函數(shù)。然后我們創(chuàng)建一個存在于BackgroundImages文件夾中的圖像列表,我們遍歷該列表并讀取每個圖像并將其附加到一個空列表中。初始索引設(shè)置為零。while True:
success, img = cap.read()
# imgOut = segmentor.removeBG(img, (255,0,255), threshold=0.83)
imgOut = segmentor.removeBG(img, imgList[indexImg], threshold=0.8)
imgStack = cvzone.stackImages([img, imgOut], 2,1)
_, imgStack = fpsReader.update(imgStack)
print(indexImg)
cv2.imshow("image", imgStack)
key = cv2.waitKey(1)
if key == ord('a'):
if indexImg>0:
indexImg -=1
elif key == ord('d'):
if indexImg
elif key == ord('q'):
break
現(xiàn)在主要部分在 while 循環(huán)中從網(wǎng)絡(luò)攝像頭讀取幀,我們使用*segmentor.removeBG()*函數(shù)從幀中刪除背景并將其替換為目錄中的圖像。在上面的代碼中,你可以看到我們已經(jīng)向segmentor.removeBG()函數(shù)傳遞了三個參數(shù) ,即來自網(wǎng)絡(luò)攝像頭的圖像幀(img),然后是目錄中存在的圖像列表以及圖像索引(imgList[indexImg) ]),最后是閾值。如果閾值設(shè)置為 1,則閾值會削減所有內(nèi)容,這里我們將其設(shè)置為 0.8,為了獲得更好的邊緣,請使用不同的閾值。然后我們使用cvzone.stackImages堆疊圖像*,* 這里我們將獲得背景替換圖像或幀的輸出。然后使用一個簡單的 if 語句,分配鍵來更改背景。例如,如果我們有 10 張背景圖像,根據(jù)上面的代碼,我們可以使用鍵“a”或鍵“d”來更改幀的背景。整個代碼如下。import cv2
import cvzone
from cvzone.SelfiSegmentationModule import SelfiSegmentation
import os
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
# cap.set(cv2.CAP_PROP_FPS, 60)
segmentor = SelfiSegmentation()
fpsReader = cvzone.FPS()
# imgBG = cv2.imread("BackgroundImages/3.jpg")
listImg = os.listdir("BackgroundImages")
imgList = []
for imgPath in listImg:
img = cv2.imread(f'BackgroundImages/{imgPath}')
imgList.a(chǎn)ppend(img)
indexImg = 0
while True:
success, img = cap.read()
# imgOut = segmentor.removeBG(img, (255,0,255), threshold=0.83)
imgOut = segmentor.removeBG(img, imgList[indexImg], threshold=0.8)
imgStack = cvzone.stackImages([img, imgOut], 2,1)
_, imgStack = fpsReader.update(imgStack)
print(indexImg)
cv2.imshow("image", imgStack)
key = cv2.waitKey(1)
if key == ord('a'):
if indexImg>0:
indexImg -=1
elif key == ord('d'):
if indexImg
elif key == ord('q'):
break
輸出截圖如下輸出 1:
輸出 2:
請輸入評論內(nèi)容...
請輸入評論/評論長度6~500個字
最新活動更多
-
即日-11.13立即報名>>> 【在線會議】多物理場仿真助跑新能源汽車
-
11月28日立即報名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會議
-
12月19日立即報名>> 【線下會議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會
-
即日-12.26火熱報名中>> OFweek2024中國智造CIO在線峰會
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍皮書》
-
精彩回顧立即查看>> 【限時免費下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
推薦專題
- 高級軟件工程師 廣東省/深圳市
- 自動化高級工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市