爲了方便技術展示,我們選取素材爲演員楊紫的一段演講視頻,用例僅爲技術交流演示使用,不針對任何指定人。
爲達到我們AI換臉的目的,我們首先需要將這段視頻逐幀提取成照片
def vedio_2_pic(self,file,save_path):
"""
逐幀取照片
file:視頻的位置
save_path:保存路徑
"""
# 讀取視頻
video = cv2.VideoCapture(file)
# 獲取視頻幀率
fps = video.get(cv2.CAP_PROP_FPS)
# 獲取畫面大小
width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))
size = (width, height)
frame_num = str(video.get(7))
ret, frame = video.read()
num =1
while True:
ret, frame = video.read()
if ret !=True:
break
cv2.imwrite(save_path + str(num) + '.jpg', frame)
num +=1
video.release()
return fps, size,frame_num
臉部融合
上一環節我們已對視頻進行了圖片提取,我希望演員楊紫可以有楊冪一樣的眼睛,長得更像楊冪一點。那麼"目標選定人"就是楊冪了。
因爲視頻可能會有鏡頭切換,對焦目標可能是觀衆或者其他人,所以在臉部融合前,需要判斷要轉換的圖片中是否有楊紫,如果有大於0.85的概率確定是楊紫,我們進行臉部融合,如果小於等於0.85概率我們就不進行臉部融合,下面進行臉部融合。
核心代碼
for i in range(frame_num):
image2="""/Users/***/face_ztl/picture/%d.jpg"""%(i)
content = video_make.img_compare(image1,image2)
try:
if content >0.85:
print('-----%d-----'%(i))
video_make.merge_face(image2,object_image,merge_rate=100)
else:
print(0)
img = cv2.imread(image2)
img_path = image2.replace('picture','picture_new')
cv2.imwrite(img_path, img)
except:
pass
print('第%d張出現了問題'%(i))
提取音頻
爲了合成後的視頻有聲音,我們將視頻中的音頻進行提取並保存下來,代碼如下:
def getMusic(self,video_name,save_path):
"""
獲取指定視頻的音頻
video_name:視頻路徑
save_path:音頻保存路徑
舉例
save_path='/Users/***/vedio/1.wav'
"""
# 讀取視頻文件
video = VideoFileClip(video_name)
# 返回音頻
audio = video.audio
audio.write_audiofile(save_path)
合成視頻
至此我們得到了音頻、融合後的圖片,接下來就是最後一步合成視頻了,代碼如下:
"""
圖片轉視頻
save_path:視頻保存路徑
"""
# 寫入視頻
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
video = cv2.VideoWriter(save_path, fourcc, fps, size)
# 排序目的
for item in range(int(frame_num)):
path = pic_path +str(item) + '.jpg'
if os.path.exists(path):
# 讀取原圖像
img = cv2.imread(path)
# 寫入視頻
video.write(img)
video.release()
爲解決初學者學習上的困難,專門建立的Python學習扣QUN:⑧⑤⑤-④零⑧-⑧⑨③從零基礎開始到Python各領域的項目實戰教程、開發工具與電子書籍。與你分享企業當下對於python人才需求及學好python的高效技巧,不停更新最新教程!點擊加入我們的 python學習圈