用Python快速實現視頻的人臉融合

爲了方便技術展示,我們選取素材爲演員楊紫的一段演講視頻,用例僅爲技術交流演示使用,不針對任何指定人。

爲達到我們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學習圈

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章