一文教你使用OpenCV+CVzone進(jìn)行實(shí)時(shí)背景替換
介紹OpenCV是一個(gè)開源計(jì)算機(jī)視覺庫(kù),可提供播放不同圖像和視頻流的權(quán)限,還有助于端到端項(xiàng)目,如對(duì)象檢測(cè)、人臉檢測(cè)、對(duì)象跟蹤等。CVzone是一個(gè)計(jì)算機(jī)視覺包,可以讓我們輕松運(yùn)行像人臉檢測(cè)、手部跟蹤、姿勢(shì)估計(jì)等,以及圖像處理和其他 AI 功能。它的核心是使用 OpenCV 和 MediaPipe 庫(kù)。
為什么需要實(shí)時(shí)背景去除?
由于許多原因,視頻的背景需要修改,如背景中有很多其他中斷或背景顏色不適合該人。因此,我們使用實(shí)時(shí)背景替換技術(shù)來替換背景并添加替換為所需內(nèi)容。
流行的背景去除技術(shù)
圖像剪切路徑 - 如果圖像的主題具有銳利的邊緣,則使用此技術(shù)。所有落在路徑之外的元素都將被消除。
圖像剪切 – 在這里,我們剪切幀中所需的區(qū)域或主題并刪除背景。
圖像遮罩 – 如果圖像有褶邊或細(xì)邊緣,我們可以使用圖像遮罩技術(shù)。
擦除背景 – 使用任何不同的工具擦除圖像的背景許多著名的應(yīng)用程序使用背景去除技術(shù)并用自定義技術(shù)替換它。在這里,我們將實(shí)現(xiàn)類似的東西,使用 OpenCV 和 CVzone。
讓我們開始實(shí)施
安裝所需的模塊。
-- 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ò)攝像頭,上面的代碼會(huì)彈出一個(gè)窗口,這里的幀大小是 640 X 480。所以我們需要注意,因?yàn)楸尘疤鎿Q圖像的大小應(yīng)該與幀大小相同,即 640 X 480 .
現(xiàn)在在這里創(chuàng)建項(xiàng)目目錄中的文件夾,我正在創(chuàng)建一個(gè)名為*'BackgroundImages'*的文件夾。你可以下載任何圖像或任意數(shù)量的圖像并將它們放在此目錄中。項(xiàng)目結(jié)構(gòu)將如下圖所示:
讓我們?cè)趩为?dú)的 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)備好實(shí)現(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() ,并將其分配給一個(gè)變量segmentor,并且為了在顯示幀每秒(fps)的輸出幀,我們使用*cvzone.FPS()*函數(shù)。然后我們創(chuàng)建一個(gè)存在于BackgroundImages文件夾中的圖像列表,我們遍歷該列表并讀取每個(gè)圖像并將其附加到一個(gè)空列表中。初始索引設(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ù)傳遞了三個(gè)參數(shù) ,即來自網(wǎng)絡(luò)攝像頭的圖像幀(img),然后是目錄中存在的圖像列表以及圖像索引(imgList[indexImg) ]),最后是閾值。如果閾值設(shè)置為 1,則閾值會(huì)削減所有內(nèi)容,這里我們將其設(shè)置為 0.8,為了獲得更好的邊緣,請(qǐng)使用不同的閾值。然后我們使用cvzone.stackImages堆疊圖像*,* 這里我們將獲得背景替換圖像或幀的輸出。然后使用一個(gè)簡(jiǎn)單的 if 語(yǔ)句,分配鍵來更改背景。例如,如果我們有 10 張背景圖像,根據(jù)上面的代碼,我們可以使用鍵“a”或鍵“d”來更改幀的背景。整個(gè)代碼如下。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:
發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
即日-12.26立即報(bào)名>>> 【在線會(huì)議】村田用于AR/VR設(shè)計(jì)開發(fā)解決方案
-
1月8日火熱報(bào)名中>> Allegro助力汽車電氣化和底盤解決方案優(yōu)化在線研討會(huì)
-
即日-1.14火熱報(bào)名中>> OFweek2025中國(guó)智造CIO在線峰會(huì)
-
即日-1.24立即參與>>> 【限時(shí)免費(fèi)】安森美:Treo 平臺(tái)帶來出色的精密模擬
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
-
精彩回顧立即查看>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
推薦專題
-
2
- 1 人形機(jī)器人核心零部件,誰(shuí)是盈利最強(qiáng)企業(yè)?
- 2 AI Agent現(xiàn)狀如何?聊聊近期國(guó)內(nèi)的智能體市場(chǎng)動(dòng)向
- 3 5nm重大突破,研祥智能助力半導(dǎo)體企業(yè)高效發(fā)展!
- 4 人形機(jī)器人引爆“PEEK材料”!概念股梳理(名單)
- 5 馬云沒回牌桌,但重注全壓在了
- 6 7 豆包AI登頂國(guó)內(nèi)第一!概念股梳理(名單)
- 8 押注AI王者歸來,歌爾股份“智能體”在下一盤“大棋”
- 9 AI超級(jí)應(yīng)用什么時(shí)候才能出現(xiàn)?
- 10 英偉達(dá)迎來當(dāng)頭一棒
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市
OFweek人工智能網(wǎng)
獲取更多精彩內(nèi)容