接着前面的人臉檢測部分,進行部分改進,成功地把人臉替換,實作了抖音前段時間比較火的一個換臉視訊所展示的效果,不過我能力有限隻能換圖檔,無法像抖音那種,利用3D的模型替換人臉,這是比較遺憾的。直接上代碼。
import cv2 #導入庫
cap=cv2.VideoCapture(0)#打開0号攝像頭 可以用視訊的名字 如"a.avi","a.mp4"
success, frame = cap.read()#讀取一桢圖像,前一個傳回值是是否成功,後一個傳回值是圖像本身
color = (255,0,0)#設定人臉框的顔色
classfier=cv2.CascadeClassifier("haarcascade_frontalface_alt.xml")#讀取模型,定義分類器
while success: #一直讀取到圖像
img1 = cv2.imread("xh.png")
success, frame = cap.read()#讀取一桢圖像
image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#将目前桢圖像轉換成灰階圖像(這裡有修改)
faceRects = classfier.detectMultiScale(image, 1.3, 5)#人臉檢測 1.3 每次搜尋視窗依次擴大30%
if len(faceRects)>0:#如果人臉數組長度大于0
for faceRect in faceRects: #對每一個人臉畫矩形框
x, y, w, h = faceRect #擷取人臉的長寬和坐标
img1 = cv2.resize(img1, (w, h), interpolation=cv2.INTER_LINEAR)
frame[y:y+h,x:x+w]=img1
# cv2.rectangle(frame, (x, y), (x+w, y+h), color) #在圖像上按人臉的坐标畫框
cv2.imshow("test", frame)#顯示圖像
key=cv2.waitKey(30) #1s延時擷取鍵值
c = chr(key & 255)
if c in ['q', 'Q', chr(27)]: #如果鍵值為 Qq、Esc 就跳出循環
break
cv2.destroyWindow("test") #銷毀視窗
這裡先提前準備好一張圖,用來替換人臉,這裡我的圖命名為xh.png。程式首先按照人臉檢測時的一個流程,讀取分類器,進入大循環循環讀取人臉階段,先擷取圖檔xh.png的資訊,然後打開攝像頭進行人臉檢測,擷取到人臉的位置以及長寬以後,對需要替換的圖檔xh.png進行規劃,重新按照人臉的資訊,比如長寬坐标,進行對應的整改,然後把整改後的圖像進行指派到人臉的資料上。
其中關鍵的兩句代碼為:
img1 = cv2.resize(img1, (w, h), interpolation=cv2.INTER_LINEAR)
frame[y:y+h,x:x+w]=img1
這裡就是把替換圖進行坐标和長寬的整改并且指派進行替換的過程。
結果如下圖:
