Python音视频开发:消除抖音短视频Logo的图形化工具实现

☞ ░ 前往老猿Python博文目录 ░

一、引言

在《Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解》节介绍了怎么通过Python+Moviepy+OpenCV实现消除视频Logo的四种方法,并提供了详细的实现思路和实现代码,但这种原生态的应用不适合开发人员以外的其他人员使用,提供一个图形界面的工具程序是比较好的解决方案,本文就介绍实现这样一个图形化工具的步骤。

本节的背景知识都在《Python音视频开发:消除抖音短视频Logo和去电视台标的实现详解》介绍了,在此就不重复介绍了。

二、图形界面设计

本程序复用了《PyQt+moviepy音视频剪辑实战1:多个音视频合成顺序播放或同屏播放的视频文件实现详解》、《PyQt+moviepy音视频剪辑实战1:多视频合成顺序播放或同屏播放的视频文件》的公用框架,该框架提供统一的print输出管理、浮动窗口管理以及系统统一框架。

2.1、主界面

在这里插入图片描述
从上面截图可以看到,主界面处理公共框架的功能外,提供了三大类功能,分别是消除准备(包括选择Logo、选择替换图)、查看功能(包括查看Logo图、查看替换图)、视频Logo消除(包括基于帧的预览、视频预览以及视频输出)。

2.2、图形化信息预览窗

该窗口可以用于预览图像及信息的展现,使用QGraphicView来实现:
在这里插入图片描述

三、程序实现

3.1、主界面派生类定义及相关初始化方法

class mainWin(QtWidgets.QMainWindow,ui_mainWin.Ui_MainWindow):def __init__(self):super().__init__()self.setupUi(self)self.initValues()self.initSignalAndSlots()self.initPublicFrame()def initWidgetSatus(self):#初始化界面元素状态self.action_selectReplaceRegion.setEnabled(False)self.action_selectLog.setEnabled(False)self.action_previewOneFrame.setEnabled(False)self.action_viewLogoImg.setEnabled(False)self.action_videoPreview.setEnabled(False)self.action_viewReplaceImg.setEnabled(False)self.action_outputVideo.setEnabled(False)def initOperations(self):#当选择不同的视频文件时要作废原视频操作的相关记录self.logoSelected = Falseself.replaceRegSelected =Falseif self.srcFName:self.videoOperation = CSubVideoImg(self.srcFName)self.replaceObject = Noneself.logoObjList = Noneself.destFNameManuChanged = Falsedef initValues(self):#部分实例变量初始化self.initWidgetSatus()self.videoOperation = Noneself.srcFName = Noneself.destFName = Noneself.srcDir = ""self.destDir = ""self.showHelpInfo = True #是否显示操作提示信息self.destFNameManuChanged = False #输出文件是否手工修改标记self.ridLogoManner = ridLogoManner_inpaint #缺省消除方式self.imgInfW = imgInfoWin.imgInfoWin() #创建图像信息展示窗self.fileDialog = QtWidgets.QFileDialog(self)self.initOperations()def initPublicFrame(self):#公共框架初始化self.toggleOperationInfObject = self.actionshowHideOpInf  # 显隐操作信息窗的开关对象如按钮、动作等,必须可以使用setText方法self.connectShowInfoSignal = self.actionshowHideOpInf.triggered  # 用于触发打开或关闭输出信息窗的信号self.connectAboutSignal = self.actionAbout.triggered  # 用于触发打开about提示窗的信号self.needShowHints = False  # 如果需要在运行窗口显示初始的操作提示信息,则将此置为True,并在本类中提供showOperationHints(displayMsgWin)实例方法def initSignalAndSlots(self): #信号和槽连接,所有重要操作都会重新触发界面元素状态设置self.btn_choiceSrc.clicked.connect(self.chooseFile) #选择源文件self.videoFile.textChanged['QString'].connect(self.verifyWidgetStatus)self.destFile.textEdited.connect(self.verifyWidgetStatus) #目标文件修改了self.btn_choiceDest.clicked.connect(self.chooseFile)self.destFile.textEdited.connect(self.manuChangeDestFName) #输出文件如果手工修改了则不会根据选择的视频文件自动同步self.action_selectLog.triggered.connect(self.selectLog) #选择Logo区域信号连接self.action_previewOneFrame.triggered.connect(self.previewOneFrame) #帧预览信号连接self.action_videoPreview.triggered.connect(self.videoPreview) #视频预览信号连接self.action_help.triggered.connect(self.help) #帮助信号连接self.action_selectReplaceRegion.triggered.connect(self.selectReplaceRegion) #替换图像选择信号连接self.action_viewLogoImg.triggered.connect(self.viewLogoImg) #查看Logo图像信号连接self.action_viewReplaceImg.triggered.connect(self.viewReplaceImg) #查看替换图像信号连接self.action_outputVideo.triggered.connect(self.convertVideo) #输出处理视频信号连接#消除方式变化信号连接self.radioButton_staticImg.toggled.connect(self.ridLogoMannerSelected)self.radioButton_frameImg.toggled.connect(self.ridLogoMannerSelected)self.radioButton_inpaint.toggled.connect(self.ridLogoMannerSelected)self.radioButton_multiSampleInpaint.toggled.connect(self.ridLogoMannerSelected)

3.2、信息显示方法

 def showHelp(self,helpinf): #显示帮助信息print(helpinf)if self.checkBox_showOperHint.isChecked():QMessageBox.information(self, '操作提示', helpinf, QMessageBox.Ok )def showInfo(self,info):#显示提示信息print(info)QMessageBox.information(self, '操作提示', info, QMessageBox.Ok )def showImgInf(self,*showObjs): #在图像信息窗按顺序显示相关图像或文本imgInfW = self.imgInfWfor showObj in showObjs:if showObj is None: continueif isinstance(showObj,str):imgInfW.showText(showObj)else:qtimg = imgInfW.showCVImg(showObj)imgInfW.show()

3.3、部件状态设置方法

    def verifyWidgetStatus(self): #根据当前操作确认界面元素的状态self.initWidgetSatus()videoFName = self.videoFile.text().strip()if len(videoFName):dir = QtCore.QDir("")if(dir.exists(videoFName)):self.action_selectLog.setEnabled(True)if self.ridLogoManner in [ridLogoManner_staticImg,ridLogoManner_frameImg]:if self.logoSelected:self.action_selectReplaceRegion.setEnabled(True)if videoFName!=self.srcFName:self.srcFName = videoFNameself.initOperations()if self.logoSelected and  (self.replaceRegSelected or self.ridLogoManner in [ridLogoManner_inpaint,ridLogoManner_multiSampleInpaint] ):self.action_previewOneFrame.setEnabled(True)self.action_videoPreview.setEnabled(True)destFName = self.destFile.text().strip()if len(destFName):self.action_outputVideo.setEnabled(True)self.destFName = destFNameif  self.replaceRegSelected:if self.ridLogoManner in [ridLogoManner_staticImg,ridLogoManner_frameImg]:self.action_viewReplaceImg.setEnabled(True)if self.logoSelected:self.action_viewLogoImg.setEnabled(True)

3.4、消除准备相关动作槽方法示例

下面是准备消除操作的一个关键槽方法–选择Logo图像的槽方法:

   def selectLog(self): #实现Logo图像选择fps = int(self.lineEdit_logoSelectFps.text().strip())if self.ridLogoManner != ridLogoManner_multiSampleInpaint:helpstr = "将弹出新窗口按设定的帧率播放视频图像,请在显示的视频上使用鼠标左键选择Logo图像的范围。注意:\n" + \"1、选择时会有蓝色边框的矩形确认选择范围,当选择完成时松开鼠标即可确认选择;\n" + \"2、视频选择时会停止播放,可以选择完成后通过鼠标右键点击或鼠标双击恢复视频播放\n" + \"3、如果选择错了可以重新选择;\n" + \"4、如果确认选择结束,按ESC或Q、q三者中的一个退出选择操作,系统将记录选择的Logo图像;\n" + \"5、选择的Logo图像可以通过查看菜单下的相关菜单进行查看。\n\n" + \"本提示信息可以通过界面“显示操作提示信息”复选框关闭。"else:helpstr = "将弹出新窗口按设定的帧率播放视频图像,请在显示的视频上使用鼠标左键选择Logo图像的范围。注意:\n" + \"1、选择时会有蓝色边框的矩形确认选择范围,当选择完成时松开鼠标即可确认选择;\n" + \"2、视频选择时会停止播放,可以选择完成后通过鼠标右键点击或鼠标双击恢复视频播放\n" + \"3、如果选择错了可以重新选择;\n" + \"4、如果确认选择,按n、N、s、S将保存当前选择Logo图像,恢复播放后可以再选择Logo再保存,以支持选择多个Logo图像" \"5,按ESC或Q、q三者中的一个退出选择操作,退出时已选择图像会保存,系统将不剔重的记录选择的所有Logo图像;\n" + \"6、选择的Logo图像可以通过查看菜单下的相关菜单进行查看。\n\n" + \"本提示信息可以通过界面“显示操作提示信息”复选框关闭。"self.showHelp(helpstr)logobjs,frame = self.videoOperation.getROI("select multiLogo Imgs Range",fps)if logobjs is not None and  len(logobjs):self.logoSelected = Trueself.logoObjList = (logobjs, frame)self.verifyWidgetStatus()self.frameMask = self.videoOperation.genMultiLogoFrameMask([logobjs[-1]],frame)self.multiFrameMask = self.videoOperation.genMultiLogoFrameMask(logobjs, frame)self.frame = frameelse:self.showInfo("本次操作没有选择对应Logo图像,如果要执行后续操作,请重新选择。")

3.5、查看动作槽方法示例

    def viewLogoImg(self): #查看Logo图像if not self.logoSelected:self.showInfo("当前视频文件尚未选择Logo图像")returnself.showImgInf( f"截取的Logo共计{len(self.logoObjList[0])}个,除了多采样图像修复术外,其他消除方法都只取最后一个。各图像如下:\n ")count = 0logoObjs = self.logoObjList[0]for logoobj in logoObjs:self.showImgInf(f"    第{count + 1}个:",logoobj[0])count += 1

3.6、视频输出槽方法

    def convertVideo(self): #输出视频self.setEnabled(False)if self.ridLogoManner in [ridLogoManner_staticImg,ridLogoManner_frameImg]:ret, inf = self.videoOperation.convertVideo(self.destFName, self.ridLogoManner, self.logoObjList, self.replaceObject)elif self.ridLogoManner == ridLogoManner_inpaint:ret,inf = self.videoOperation.convertVideo( self.destFName, self.ridLogoManner, self.logoObjList, frameMask=self.frameMask)else:ret,inf = self.videoOperation.convertVideo( self.destFName, self.ridLogoManner, self.logoObjList, frameMask=self.multiFrameMask)print(inf)self.setEnabled(True)

四、主程序代码

if __name__=='__main__':app = QtWidgets.QApplication(sys.argv)w = mainWin()loadWin = loadApp.loadAppWin(w,"视频Logo消除", True, True)w.show()sys.exit(app.exec_())

五、运行截图

1、初始界面
在这里插入图片描述

2、选择Logo图像的截图
在这里插入图片描述
3、查看Logo图像的截图
在这里插入图片描述
4、输出视频文件截图
在这里插入图片描述

六、打包成exe

使用《PyQt(Python+Qt)学习随笔:windows下使用pyinstaller将PyQt文件打包成exe可执行文件》介绍的方法进行打包。

老猿在win7上最终打包的可执行程序包已经上传到百度云,大家可以下载下来长期免费使用。具体下载地址为百度网盘。

链接:https://pan.baidu.com/s/1UNaA2UqQBoxx-v8rCIPDhA

提取码:yh2d

选择该链接下的:视频Logo消除工具V2.0.rar 即可。

注意:
百度云上分享的《咖啡狗免费工具软件共享空间》下的不同软件安装时必须解压到不同目录,如果解压到同一目录可能有冲突导致不能正常运行,但解压后遵循如下要求可以将其聚合到同一个目录:

  1. 放置到同一目录的不同软件的版本必须相同,版本为压缩文件名中VX.X标注;
  2. 聚合拷贝时除拷贝执行文件外,还有resource目录必须拷贝,如果resource目录下有相同文件名可以覆盖;
  3. 聚合拷贝exe文件和resource目录及其下文件到其他已解压工具目录后,源目录可以删除。

更多moviepy的介绍请参考《PyQt+moviepy音视频剪辑实战文章目录》或《moviepy音视频开发专栏》。这2个专栏内容的导读请参考《Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏加起来只需要19.9元,都适合有一定Python基础但无相关专利知识的小白读者学习。这2个收费专栏都有对应免费专栏,只是收费专栏的文章介绍更具体、内容更深入、案例更多。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》。本文对应付费专栏文章为《Python音视频开发:消除抖音短视频Logo的图形化工具实现过程详解》。

关于Moviepy音视频开发的内容,请大家参考《Python音视频剪辑库MoviePy1.0.3中文教程导览及可执行工具下载》的导览式介绍。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python!

☞ ░ 前往老猿Python博文目录 ░

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41834.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

元宇宙系列--用AI数字人物进行抖音直播

目前抖音无人直播比较普及,从起初的挤火车,云蹦迪,冲马桶,随后比较火的广场舞、过马路等等一系列的抖音互动游戏直播。 以上都是一个软件可以完成,非常容易被抖音禁播。近期已经有不少直播互动游戏被禁播了。 现在来介…

每秒最高1w+使用量,「AI绘画」成抖音年度爆款,背后技术秘籍现已公开

允中 发自 凹非寺来源 | 量子位 QbitAI 「AI绘画」是2022年抖音上最火的一款特效玩法,用户只要输入一张图片,AI就会根据图片生成一张动漫风格的图片。 由于生成的图片效果带有一定的“盲盒”属性 ,画风精致唯美中又带着些许的蠢萌和无厘头&am…

用AI人脸识别技术实现抖音特效

♚ 李远君 ,Web和云计算开发人员。Java,Python,Golang爱好者。 个人网址:https://tomoncle.com 本文作者已加入Python中文社区专栏作者计划 导言 为什么会写这个人脸例子? 浏览博客的过程,无意发现了一篇名…

Github 热度飙升,一键生成最近抖音超火的 AI 人物绘图

点击关注公众号,利用碎片时间学习 Paper2GUI 是一款面向普通人的 AI 桌面 APP 工具箱,免安装即开即用,已支持20AI 模型,内容涵盖语音合成、视频补帧、视频超分、目标检测、图片风格化、OCR 识别等领域。支持 Windows、Mac、Linux …

抖音一键生成的AI绘画火了,网友惊呼:有点东西

在各大AI绘画软件争奇斗艳的时候,近期最火的AI绘画莫过于抖音一键生成的AI绘画特效,网友惊呼:有点东西。 就连最近话题度超高的“汪小菲”,也用AI绘画来“秀”恩爱了。 AI绘画识别度还挺高,特别是关于大白志愿者的生成…

讯飞语音的中的bug用户校验失败

用户校验失败:原因是目录没有复制粘贴正确. 下面是刚刚下载的SDK目录: 下面的是自己Android工程中的目录:注意复制粘贴的文件路径要正确 转载于:https://www.cnblogs.com/Oldz/p/9620359.html

Android端科大讯飞语音应用开发

创建语音应用及sdk集成 讯飞开放平台网址 网址:http://www.xfyun.cn/ 1.注册讯飞账号,我以前注册过就直接登录了,创建应用(注:创建过的应用不能被删除)2.创建应用名称规范: 名称_平台类型3.这里显示你的APPID,应用的唯一标示4.创建完成之后现在并没什么卵用,还需要…

python3讯飞语音识别

#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib.parse, urllib.request #这是python3,原先py2里的urllib2或者其他都包含在了py3的urllib里了, # py3里的urllib里的parse和request一定要这么导入,直接import urllib # 是不行的imp…

移动开发-语音识别-调用讯飞平台提供的API

1 登录讯飞平台,申请账号,创建一个应用 具体步骤可以百度查找 2 进入“我的应用”,下载相应的SDK文件 选择语音听写(流式版)-> Android MSC 3 打开安卓,新建项目 创建一个EditText和一个Button &…

UNIAPP调用讯飞语音评测API

1、历经千辛万苦,UNIAPP调用评测API终于完成,在此做下总结下:首先看效果! 2、实现第1步,首先是鉴权,用到的CryptoJS等工具都可以从讯飞和uniapp官方获取 import * as base64 from "base-64" impo…

Android科大讯飞语音集成,非常详细的使用讲解

讯飞语音开发集成地址http://www.xfyun.cn/ 解压后的doc文件夹下的msc develop 文件中有详细集成步骤 AppId: 1.先要注册开发者账户, 添加我的应用 , 下载sdk 2.下载后将sdk解压, 把案例导入工程中运行看看效果 3.将libs下的两个jar包添加到libs目录下, 将同路径下的其它 …

Android 讯飞语音识别功能开发

以下代码主要参考博客: Android 科大讯飞语音识别 Android蓝牙串口开发部分请参照博客: Android蓝牙串口开发 讯飞语音官方开发文档: 语音听写 Android SDK 文档 文章目录 前言一、SDK的下载和导入1.SDK的下载2.新建工程3.配置项目a.导包b.权…

uniapp - 接入科大讯飞语音评测

欢迎关注微信公众号:FSA全栈行动 👋 一、简介 科大讯飞语音评测可以对字、词、句、篇章等题型进行多维度评分(准确度、流畅度、完整度、声韵调型等),支持中文和英文。最新的流式版使用 webSocket 调用接口&#xff0c…

目标检测算法——YOLOv5/YOLOv7改进之结合​PP-LCNet(轻量级CPU网络)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 ​PP-LCNet——轻量级且超强悍的CPU级骨干网络&#xff01;&#xff01; &#xff08;一&#xff09;前沿介绍 1.PP-LCNet主要模块 2.相关实验结果 &#xff08;二&#xff09;YOLOv5/YOLOv7改进之结…

从Blip2到Segment Anything视觉语义金字塔+ChatGPT= 把图片变文本段落, 8G显存即可Run...

关注公众号&#xff0c;发现CV技术之美 8G GPU显存即可以运行 Twitter链接&#xff1a;https://twitter.com/awinyimgprocess/status/1646225454599372800?s46&tHvOe9T2n35iFuCHP5aIHpQ 代码链接&#xff1a;https://github.com/showlab/Image2Paragraph https:// 01 …

目标检测算法——YOLOv5/YOLOv7改进之结合​ASPP(空洞空间卷积池化金字塔)

&#x1f496;&#x1f496;>>>加勒比海带&#xff0c;QQ2479200884<<<&#x1f496;&#x1f496; &#x1f340;&#x1f340;>>>【YOLO魔法搭配&论文投稿咨询】<<<&#x1f340;&#x1f340; ✨✨>>>学习交流 | 温澜潮…

从BLIP-2到SAM视觉语义金字塔+ChatGPT= 把图片变文本段落, 8G显存即可Run

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【图像分割】微信技术交流群 作者&#xff1a;老大 |&#xff08;已授权转载&#xff09;编辑&#xff1a;CVer https://zhuanlan.zhihu.com/p/621503837 8G GPU显存即可以运…

问一下ChatGPT:DIKW金字塔模型

经常看到这张DIKW金字塔模型图&#xff0c;还看到感觉有点过份解读的图&#xff0c;后面又加上了insight&#xff0c;impact等内容。 Data&#xff1a;是数据&#xff0c;零散的、无规则的呈现到人们眼前&#xff0c;如果你只看到这些数字&#xff0c;如果没有强大的知识背景&a…

QCon: 工程师成长的金字塔思维

QCon 线下会议终于来了&#xff0c;但这次的分享有一些意外&#xff0c;不是性能、架构、内核、缓存&#xff0c;而不是AI实践相关的内容&#xff0c;论坛的主题是“工程师成长实践”&#xff0c;而我的topic 是“工程师成长的金字塔思维”。本以为这是一个非热门话题&#xff…

拉普拉斯金字塔

原文 高斯金字塔G0层下采样后为G1&#xff0c;用G0减去G1的上采样&#xff0c;就得到了拉普拉斯层L0. 高斯金字塔G1层上采样后与拉普拉斯金字塔L0层相加后就得到了G0层。 import numpy as np import cv2 as cv from matplotlib import pyplot as pltimg cv.imread(left_01.png…