一文教你使用OpenCV+CVzone進(jìn)行實(shí)時(shí)背景替換
介紹OpenCV是一個(gè)開源計(jì)算機(jī)視覺庫,可提供播放不同圖像和視頻流的權(quán)限,還有助于端到端項(xiàng)目,如對(duì)象檢測、人臉檢測、對(duì)象跟蹤等。CVzone是一個(gè)計(jì)算機(jī)視覺包,可以讓我們輕松運(yùn)行像人臉檢測、手部跟蹤、姿勢估計(jì)等,以及圖像處理和其他 AI 功能。它的核心是使用 OpenCV 和 MediaPipe 庫。
為什么需要實(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è)簡單的 if 語句,分配鍵來更改背景。例如,如果我們有 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)論長度6~500個(gè)字
最新活動(dòng)更多
-
10月31日立即下載>> 【限時(shí)免費(fèi)下載】TE暖通空調(diào)系統(tǒng)高效可靠的組件解決方案
-
即日-11.13立即報(bào)名>>> 【在線會(huì)議】多物理場仿真助跑新能源汽車
-
11月28日立即報(bào)名>>> 2024工程師系列—工業(yè)電子技術(shù)在線會(huì)議
-
12月19日立即報(bào)名>> 【線下會(huì)議】OFweek 2024(第九屆)物聯(lián)網(wǎng)產(chǎn)業(yè)大會(huì)
-
即日-12.26火熱報(bào)名中>> OFweek2024中國智造CIO在線峰會(huì)
-
即日-2025.8.1立即下載>> 《2024智能制造產(chǎn)業(yè)高端化、智能化、綠色化發(fā)展藍(lán)皮書》
推薦專題
- 1 【一周車話】沒有方向盤和踏板的車,你敢坐嗎?
- 2 特斯拉發(fā)布無人駕駛車,還未迎來“Chatgpt時(shí)刻”
- 3 特斯拉股價(jià)大跌15%:Robotaxi離落地還差一個(gè)蘿卜快跑
- 4 馬斯克給的“驚喜”夠嗎?
- 5 大模型“新星”開啟變現(xiàn)競速
- 6 海信給AI電視打樣,12大AI智能體全面升級(jí)大屏體驗(yàn)
- 7 打完“價(jià)格戰(zhàn)”,大模型還要比什么?
- 8 馬斯克致敬“國產(chǎn)蘿卜”?
- 9 神經(jīng)網(wǎng)絡(luò),誰是盈利最強(qiáng)企業(yè)?
- 10 比蘋果偉大100倍!真正改寫人類歷史的智能產(chǎn)品降臨
- 高級(jí)軟件工程師 廣東省/深圳市
- 自動(dòng)化高級(jí)工程師 廣東省/深圳市
- 光器件研發(fā)工程師 福建省/福州市
- 銷售總監(jiān)(光器件) 北京市/海淀區(qū)
- 激光器高級(jí)銷售經(jīng)理 上海市/虹口區(qū)
- 光器件物理工程師 北京市/海淀區(qū)
- 激光研發(fā)工程師 北京市/昌平區(qū)
- 技術(shù)專家 廣東省/江門市
- 封裝工程師 北京市/海淀區(qū)
- 結(jié)構(gòu)工程師 廣東省/深圳市