(八)批量视频处理、批量视频编辑、背景移除/去背景/换背景/抠图/抠像代码/实时抠图、实时抠像、人像去背景、背景消除、摄像头背景移除

(八)批量视频处理、批量视频编辑、背景移除/去背景/换背景/抠图/抠像代码/实时抠图、实时抠像、人像去背景、背景消除、摄像头背景移除

当前短视频飞速发展,视频博主经常需要对大量视频进行编辑、处理,商用的视频编辑软件如剪影、蜜蜂剪辑、快剪辑等都无法对大量视频进行批量处理。短视频一般包含人像,如果对人像进行更换背景的批量操作,就没有好的工具可用了。
本文实现了视频批量更换背景的功能,使用了人工智能Matting的算法,可以达到发丝级别的抠像。
软件打包上传了百度网盘:
【视频背景移除】链接: https://pan.baidu.com/s/1Dhr7MHkGd8vlXfyETrK3xQ 提取码: 29n2
【图像背景移除】链接: https://pan.baidu.com/s/1nhuWMYWvTV3B0d0CdGDhFQ 提取码: q46x
【摄像头背景移除】链接: https://pan.baidu.com/s/1tx88C3dCH3ej3PJcKLDmdQ 提取码: g7xy

本文与前几篇博文关联性较强,请事先阅读前几篇。 对此文感兴趣的可以加微深入探讨:herbert156

一、主要功能:
以下的Python代码的功能:批量选择视频、批量选择背景、视频背景移除、去背景、人像抠图、换背景等,主要包括:
1、对包含人像的视频进行抠像,并替换背景(可以替换成纯色的、也可以替换成指定背景图片,如果选择多个背景文件,则按照选择顺序循环切换背景);
2、可以批量处理,在选择文件/背景文件的对话框里可以选择多个文件,同时抠像换背景、批量操作;
3、软件设置里可以设置使用GPU处理还是CPU处理,软件只支持英伟达(Nvidia)的GTX/RTX系列的GPU;
4、抠图算法的模型有3种:简陋、细致、精细,可以根据原始图片的背景复杂度随意选择;简陋模型处理速度最快、精细的速度最慢。快慢也与视频分辨率强相关。
5、信息统计里面可以实时显示处理的各种统计信息;
6、视频处理完毕后自动进行音频的处理与合成。
在这里插入图片描述

二、主要代码:

    def video_change_background(self, videofile, backfile, bg_file_name):     #videofile:文件名、backfile:文件img
        global bg_files, iii, stop_flag, t0
        try: cap = cv2.VideoCapture(videofile)  # 读取视频文件
        except: self.show_error('读取视频文件:'+videofile+'时,出现错误!'); return
        fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
        total_fr = cap.get(cv2.CAP_PROP_FRAME_COUNT)  # 总帧数
        size_x = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))  # 视频流的帧宽度
        size_y = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # 视频流的帧高度
        len_m,len_s = divmod(total_fr/fps, 60)
        videoinfo = '【文件信息】 视频总数:%d|正在处理(%d/%d):'%(filesnums,iii,filesnums) + os.path.split(videofile)[1]+\
                    '|帧分辨率:%dx%d|视频长度:%d分%d秒|FPS:%.2f帧/秒   |当前背景:'%(size_x,size_y,len_m,len_s,fps)+\
                    os.path.split(bg_file_name)[1]
        self.txt11.setText(videoinfo)

        img1 = cv2.resize(backfile, (size_x, size_y))
        tempfile = os.path.split(bg_files[0])[0]+'\\out.mp4'
        out = cv2.VideoWriter(tempfile, cv2.VideoWriter_fourcc(*'mp4v'), fps, (size_x, size_y))
        t1 = time.time(); next_fr = 0
        if size_x / size_y > 1.778: fx = 427 / size_x; fy = fx   # 计算16:9的比例,以便缩放不变形
        else: fx = 240 / size_y; fy = fx

        while (True):
            t2 = time.time()
            if stop_flag:
                cap.release();  out.release(); os.remove(tempfile)
                self.txt11.setText('【文件信息】 文件总数:%d个 | 处理完成:%d个' % (filesnums, iii))
                self.txt12.setText('【运行信息】 用户终止了正在运行的程序......')
                return
            next_fr += 1
            ret, frame = cap.read()
            if ret:
                if not DEBUG_FLAG: img2 = self.koutu(frame)
                else: img2 = frame
                #img2 = cv2.cvtColor(frame.copy(), cv2.COLOR_BGR2BGRA)   #测试用语句
                img3 = self.two_pic_combine_PIL(img1,img2)
                out.write(img3)  # 帧转成视频
            else: break
            if Box1_flag: self.my_label1.setPixmap(self.CvMatToQImage(cv2.resize(frame,(0,0),fx=fx,fy=fy)))
            if Box2_flag: self.my_label2.setPixmap(self.CvMatToQImage(cv2.resize(img3,(0,0),fx=fx,fy=fy)))
            cv2.waitKey(1)
            t3 = time.time(); m1, s1 = divmod(t3-t0, 60); m2, s2 = divmod(t3-t1, 60)
            runinfo = '【运行信息】 当前视频处理进度:%d%% | 总耗时:%d分%d秒 | 当前视频耗时:%d分%d秒 | 当前帧耗时:%.2f秒 | 处理速度:%.1fFPS'\
                      %(100*next_fr/total_fr, m1, s1, m2, s2,(t3-t2),1/(t3-t2))
            self.txt12.setText(runinfo)

        cap.release(); out.release()
        self.txt12.setText('【运行信息】 正在分离、合成音轨(大概需要:%.1f分钟,不要关闭软件),请稍后......'%(len_m/2))
        cv2.waitKey(1)
        audio = mpe.AudioFileClip(videofile)  # 分离声轨
        clip = mpe.VideoFileClip(tempfile)
        videoclip = clip.set_audio(audio)  # 写入声轨
        videoclip.write_videofile(out_dir+'/'+os.path.splitext(os.path.split(videofile)[1])[0]+'_1.mp4')
        os.remove(tempfile)
        t3 = time.time()
        self.txt12.setText('【运行信息】 处理完毕!总消耗时间:%d分%d秒'%(m1, s1))
        self.txt11.setText('【文件信息】 文件总数:%d个 | 处理完成:%d个'%(filesnums,iii))

三、代码说明
工具的AI处理使用了百度飞浆的PaddleSeg,具体使用说明、细节请参考百度飞桨网站:https://github.com/PaddlePaddle/PaddleSeg

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值