天天看點

人臉識别之換臉

接着前面的人臉檢測部分,進行部分改進,成功地把人臉替換,實作了抖音前段時間比較火的一個換臉視訊所展示的效果,不過我能力有限隻能換圖檔,無法像抖音那種,利用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
           

這裡就是把替換圖進行坐标和長寬的整改并且指派進行替換的過程。

結果如下圖:

人臉識别之換臉
人臉識别之換臉

繼續閱讀