视频去水印或字幕【通用】

news/2025/1/15 20:48:43/

文件结构

在这里插入图片描述

安装库

moviepy1.0.3
numpy
1.21.5
opencv_python==4.5.5.62

安装库方法

pip install moviepy==1.0.3 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install numpy==1.21.5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
pip install opencv_python==4.5.5.62 -i https://pypi.tuna.tsinghua.edu.cn/simple/

代码

import os
import sysimport cv2
import numpy
from moviepy import editorVIDEO_PATH = 'video'
OUTPUT_PATH = 'output'
TEMP_VIDEO = 'temp.mp4'class WatermarkRemover():def __init__(self, threshold: int, kernel_size: int):self.threshold = threshold  # 阈值分割所用阈值self.kernel_size = kernel_size  # 膨胀运算核尺寸def select_roi(self, img: numpy.ndarray, hint: str) -> list:'''框选水印或字幕位置,SPACE或ENTER键退出:param img: 显示图片:return: 框选区域坐标'''COFF = 0.7w, h = int(COFF * img.shape[1]), int(COFF * img.shape[0])resize_img = cv2.resize(img, (w, h))roi = cv2.selectROI(hint, resize_img, False, False)cv2.destroyAllWindows()watermark_roi = [int(roi[0] / COFF), int(roi[1] / COFF), int(roi[2] / COFF), int(roi[3] / COFF)]return watermark_roidef dilate_mask(self, mask: numpy.ndarray) -> numpy.ndarray:'''对蒙版进行膨胀运算:param mask: 蒙版图片:return: 膨胀处理后蒙版'''kernel = numpy.ones((self.kernel_size, self.kernel_size), numpy.uint8)mask = cv2.dilate(mask, kernel)return maskdef generate_single_mask(self, img: numpy.ndarray, roi: list, threshold: int) -> numpy.ndarray:'''通过手动选择的ROI区域生成单帧图像的水印蒙版:param img: 单帧图像:param roi: 手动选择区域坐标:param threshold: 二值化阈值:return: 水印蒙版'''# 区域无效,程序退出if len(roi) != 4:print('NULL ROI!')sys.exit()# 复制单帧灰度图像ROI内像素点roi_img = numpy.zeros((img.shape[0], img.shape[1]), numpy.uint8)start_x, end_x = int(roi[1]), int(roi[1] + roi[3])start_y, end_y = int(roi[0]), int(roi[0] + roi[2])gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)roi_img[start_x:end_x, start_y:end_y] = gray[start_x:end_x, start_y:end_y]# 阈值分割_, mask = cv2.threshold(roi_img, threshold, 255, cv2.THRESH_BINARY)return maskdef generate_watermark_mask(self, video_path: str) -> numpy.ndarray:'''截取视频中多帧图像生成多张水印蒙版,通过逻辑与计算生成最终水印蒙版:param video_path: 视频文件路径:return: 水印蒙版'''video = cv2.VideoCapture(video_path)success, frame = video.read()roi = self.select_roi(frame, 'select watermark ROI')mask = numpy.ones((frame.shape[0], frame.shape[1]), numpy.uint8)mask.fill(255)step = video.get(cv2.CAP_PROP_FRAME_COUNT) // 5index = 0while success:if index % step == 0:mask = cv2.bitwise_and(mask, self.generate_single_mask(frame, roi, self.threshold))success, frame = video.read()index += 1video.release()return self.dilate_mask(mask)def generate_subtitle_mask(self, frame: numpy.ndarray, roi: list) -> numpy.ndarray:'''通过手动选择ROI区域生成单帧图像字幕蒙版:param frame: 单帧图像:param roi: 手动选择区域坐标:return: 字幕蒙版'''mask = self.generate_single_mask(frame, [0, roi[1], frame.shape[1], roi[3]], self.threshold)  # 仅使用ROI横坐标区域return self.dilate_mask(mask)def inpaint_image(self, img: numpy.ndarray, mask: numpy.ndarray) -> numpy.ndarray:'''修复图像:param img: 单帧图像:parma mask: 蒙版:return: 修复后图像'''telea = cv2.inpaint(img, mask, 1, cv2.INPAINT_TELEA)return teleadef merge_audio(self, input_path: str, output_path: str, temp_path: str):'''合并音频与处理后视频:param input_path: 原视频文件路径:param output_path: 封装音视频后文件路径:param temp_path: 无声视频文件路径'''with editor.VideoFileClip(input_path) as video:audio = video.audiowith editor.VideoFileClip(temp_path) as opencv_video:clip = opencv_video.set_audio(audio)clip.to_videofile(output_path)def remove_video_watermark(self):'''去除视频水印'''if not os.path.exists(OUTPUT_PATH):os.makedirs(OUTPUT_PATH)filenames = [os.path.join(VIDEO_PATH, i) for i in os.listdir(VIDEO_PATH)]mask = Nonefor i, name in enumerate(filenames):if i == 0:# 生成水印蒙版mask = self.generate_watermark_mask(name)# 创建待写入文件对象video = cv2.VideoCapture(name)fps = video.get(cv2.CAP_PROP_FPS)size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))video_writer = cv2.VideoWriter(TEMP_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)# 逐帧处理图像success, frame = video.read()while success:frame = self.inpaint_image(frame, mask)video_writer.write(frame)success, frame = video.read()video.release()video_writer.release()# 封装视频(_, filename) = os.path.split(name)output_path = os.path.join(OUTPUT_PATH, filename.split('.')[0] + '_no_watermark.mp4')  # 输出文件路径self.merge_audio(name, output_path, TEMP_VIDEO)if os.path.exists(TEMP_VIDEO):os.remove(TEMP_VIDEO)def remove_video_subtitle(self):'''去除视频字幕'''if not os.path.exists(OUTPUT_PATH):os.makedirs(OUTPUT_PATH)filenames = [os.path.join(VIDEO_PATH, i) for i in os.listdir(VIDEO_PATH)]roi = []for i, name in enumerate(filenames):# 创建待写入文件对象video = cv2.VideoCapture(name)fps = video.get(cv2.CAP_PROP_FPS)size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))video_writer = cv2.VideoWriter(TEMP_VIDEO, cv2.VideoWriter_fourcc(*'mp4v'), fps, size)# 逐帧处理图像success, frame = video.read()if i == 0:roi = self.select_roi(frame, 'select subtitle ROI')while success:mask = self.generate_subtitle_mask(frame, roi)frame = self.inpaint_image(frame, mask)video_writer.write(frame)success, frame = video.read()video.release()video_writer.release()# 封装视频(_, filename) = os.path.split(name)output_path = os.path.join(OUTPUT_PATH, filename.split('.')[0] + '_no_sub.mp4')  # 输出文件路径self.merge_audio(name, output_path, TEMP_VIDEO)if os.path.exists(TEMP_VIDEO):os.remove(TEMP_VIDEO)if __name__ == '__main__':sel=input('1:去水印, 2:去字幕\n')if sel=='1':remover = WatermarkRemover(threshold=80, kernel_size=5)remover.remove_video_watermark()if sel=='2':remover = WatermarkRemover(threshold=80, kernel_size=5)remover.remove_video_subtitle()

http://www.ppmy.cn/news/745885.html

相关文章

grafana+prometheus+pushgateway+flink可视化实时监控

文章目录 一、各部分介绍二、安装配置1、安装pushgateway2、安装Prometheus3、Grafana 安装 三、测试使用 一、各部分介绍 采集层 flink APP和linux system两部分,是我们要收集指标数据的组件传输层 Pushgateway:是一个推送收集和推送数据的组件 Node_ex…

android模拟器录制视频教程,夜神安卓模拟器怎么录制视频 夜神安卓模拟器录制视频教程...

夜神安卓模拟器v3.8.0.0 官方最新版 类型:手机工具大小:295M语言:中文 评分:5.8 标签: 立即下载 夜神安卓模拟器是一款非常专业的功能强大的模拟器软件,你可以使用夜神安卓模拟器在电脑上畅玩手机游戏&…

你知道视频怎么去水印吗?试试这三个方法学会怎么去视频水印

做自媒体小伙伴有没有遇到过这种情况?在一些视频软件上编辑的视频导出来却发现带有这个平台的水印,影响视频的观感以及后续的发布,想要将视频水印去除,但是又不知道怎么做,别着急,这篇文章跟大家分享视频怎…

【各种视频网站去水印】无需任何软件 在浏览器 动动手指就行

以 Chrome 浏览器为例 一、F12打开控制台或者右键检查手动进入 二、Elements 页面按 ctrlF 搜索 txp-ui-watermark-mod 三、点击搜索中的那一行 右键点击 Delete element 四、OK 视频右上角没有水印了

android模拟器的录屏,夜神安卓模拟器如何录制视频

自媒体视频发展如此火的现在,很多的游戏玩家通过把自己的视频录制下来,传到网上进行分析,那么夜神安卓模拟器如何录制视频呢 许多伙伴还不明白夜神安卓模拟器录制视频的详细操作,下面小编就分享夜神安卓模拟器录制视频的方法&…

go-redis的基本使用

Golang操作Redis 安装go-redis //redis 6 go get github.com/go-redis/redis/v8 //redis 7 go get github.com/go-redis/redis/v9golang连接redis import "github.com/go-redis/redis/v8" var rdb *redis.Clientfunc init() {rdb : redis.NewClient(&redis.Opt…

【Flutter】 包管理(16)Flutter 流处理 深入理解和应用 Stream Transform 包实时处理数据

文章目录 一、 前言二、 Stream Transform 包详解1. Stream Transform 和 ReactiveX 的关系2. Stream Transform 的高级操作三、 版本信息四、 深入应用:使用 Stream Transform 实现复杂的业务逻辑1. 合并多个流2. 控制事件的发射频率五、 示例:使用 Stream Transform 实现复…

Mac中VSCode配置vue项目环境

一、下载VSCode 进入VSCode官网,下载Mac版安装包 设置中文: vscode导航栏view -> Command Palette -> 输入Configure Display Language -> 选择简体中文 -> 重启 二、下载node.js 下载地址:node.js官网,建议下载长期维护版本…