zoukankan      html  css  js  c++  java
  • 用Python快速实现视频的人脸融合

    图片提取

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1097524789

    为了方便技术展示,我们选取素材为演员杨紫的一段演讲视频,用例仅为技术交流演示使用,不针对任何指定人。

    为达到我们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()
     
  • 相关阅读:
    java中小数的处理:高精度运算用bigDecimal类,精度保留方法,即舍入方式的指定
    java基本类型(数值范围):浮点的底层表示定义,float计算快一些
    Dynamics CRM 开启EmailRouter日志记录
    shell的date日期循环方法:日期格式转时间戳计算,再将时间戳转回日期格式
    shell的数值计算,小数计算
    QT 入门教程经典
    QTSingleApplication使用笔记
    APP 上架苹果应用商城
    C、VDD、VSS、 VEE 和VPP的区别
    PIC12F629帮我用C语言写个程序,控制三个LED亮灭
  • 原文地址:https://www.cnblogs.com/shann001/p/13099331.html
Copyright © 2011-2022 走看看