基于图像识别和文字识别用 Python 提取视频字幕

PaddleOCR从小红书视频中提取字幕并生成思维导图 摘要:本教程介绍使用PaddleOCR从小红书视频提取字幕并生成思维导图的技术方案。通过Docker环境隔离,结合OCR图像识别和语音转文字技术,实现视频内容的高效提取。核心步骤包括:1)创建CUDA加速的Docker容器;2)下载目标视频;3)采用OCR识别字幕区域;4)结构化处理文本内容。该方案可提升90%的信息获取效率,适用于中文视频内容的知识抽取场景。 阅读详情

基于图像识别和文字识别用 Python 提取视频字幕

本文介绍使用 Python 基于图像识别提取视频中的字幕,并使用文字识别将字幕转为纯文本。本文以权力的游戏第一季第一集作为示例。

本文主要使用 OpenCV 读取视频并进行图像处理,需安装以下依赖的库:

pip install opencv-python
pip install Pillow
pip install numpy

1、使用 opencv 读取视频

对于视频文件,可以使用 cv2 的 VideoCapture 类读取:

import cv2

video_filename = '/Users/csd/S01E01.mkv'
videoCap = cv2.VideoCapture(video_filename)

调用 get() 方法可以得到视频文件的一些基本信息:

# 帧频
fps = videoCap.get(cv2.CAP_PROP_FPS)
# 视频总帧数
total_frames = int(videoCap.get(cv2.CAP_PROP_FRAME_COUNT))
# 图像尺寸
image_size = (int(videoCap.get(cv2.CAP_PROP_FRAME_HEIGHT)), int(videoCap.get(cv2.CAP_PROP_FRAME_WIDTH)))

print(fps)
print(total_frames)
print(image_size)

输出:

23.976023976023978
88644
(576, 1024)

可以看到该视频帧频为 24 fps,共 88644 帧画面,图片尺寸为 (576, 1024)。

调用 read() 方法可以读取一帧的图片

sucess, frame = videoCap.read()

当 sucess 为 True 时,读取成功,此时 frame 是图像像素矩阵,三维 numpy 矩阵。

由于视频开头总会有片头,且字幕不总是在开头就出现,所以选取 1:57 位置的一帧进行演示,使用 PIL 库转为 Image 对象并显示出来,如下图所示:

for i in range(2818):
    sucess, frame = videoCap.read()
    
from PIL import Image
img = Image.fromarray(frame)
img.show()

在这里插入图片描述

2、字幕图片提取与处理

接下来确定字幕的范围

im = frame[:, :, 0]
im = im[495:570, :]     //  确定字幕的范围,注意不同的视频文件剪切的索引值不同
img = Image.fromarray(im)
img.show()

剪切的字幕图片如下所示:
在这里插入图片描述

在进行下一步分析前,需对图像做二值化处理。由于字幕的白色的,像素值为 255,将二值化阈值设为 220。

thresh = 220
_, im = cv2.threshold(im, thresh, 255, cv2.THRESH_BINARY)
img = Image.fromarray(im)
img.show()

在这里插入图片描述

接下来的一个重要的问题是如何将连续的字幕提取出来,并且不重复。在此使用两张字幕计算平均平方误差的百分比,确定所需提取的字幕。选取如下4帧的字幕进行对比展示:

  • im0: 没有字幕的一帧:
    在这里插入图片描述
  • im1: 上面演示的一帧;
  • im2: im1 的下一帧,字幕相同;
  • im3: 另一句字幕的一帧:
    在这里插入图片描述

接着根据下面的公式计算两张图像间每个像素点的平方误差之和的平均值百分比:

在这里插入图片描述

计算每张图像与 0 值图像的误差 e(也即上述公式中b为0):

print((im0 ** 2).sum() / im0.size * 100)
print((im1 ** 2).sum() / im1.size * 100)
print((im2 ** 2).sum() / im2.size * 100)
print((im3 ** 2).sum() / im3.size * 100)

得到结果为:

0.0
1.79817708333
1.79817708333
5.66666666667

可以看出,当 e > 1 时,图像才有字幕。

接着计算相同字幕和不同字幕图像直接的误差 e:

print(((im2 - im1) ** 2).sum() / im1.size * 100)
print(((im3 - im1) ** 2).sum() / im1.size * 100)

得到

0.00260416666667
6.64453125

可以看出误差 e > 1 时,字幕发生切换。

3、完整提取一个视频的字幕

为了方便文字识别,将 20 句字幕组合成一张图片。完整的提取字幕的代码如下:

import cv2
from PIL import Image
import numpy as np
import os
import datetime


def format_time(second):
    hours = second // 3600
    minutes = (second - hours * 3600) // 60
    second = second - hours * 3600 - minutes * 60
    t = datetime.time(hour=hours, minute=minutes, second=second)
    return datetime.time.isoformat(t)


def cal_stderr(img, imgo=None):
    if imgo is None:
        return (img ** 2).sum() / img.size * 100
    else:
        return ((img - imgo) ** 2).sum() / img.size * 100


def save_image(ex_folder, img: Image, starts: int, ends: int):
    # 保存字幕图片到文件夹
    start_time = format_time(starts)
    end_time = format_time(ends)
    timeline = '-'.join([start_time, end_time]) + ".png"
    try:
        imgname = os.path.join(ex_folder, timeline)
        img.save(imgname)
        print('export subtitle at %s' % timeline)
    except Exception:
        print('export subtitle at %s error' % timeline)


def export_subtitle(video_filename):
    ex_folder = os.path.splitext(video_filename)[0]
    if not os.path.exists(ex_folder):
        os.mkdir(ex_folder)
    skip_frames = 2818
    videoCap = cv2.VideoCapture(video_filename)
    for i in range(skip_frames):
        videoCap.read()
    start_frame = skip_frames
    curr_frame = skip_frames
    fps = videoCap.get(cv2.CAP_PROP_FPS)
    success = True
    subtitle_img = None
    last_img = None
    img_count = 0
    while success:
        for j in range(9):
            videoCap.read()
            curr_frame += 1
        success, frame = videoCap.read()
        curr_frame += 1
        if frame is None:
            print('video: %s finish at %d frame.' % (video_filename, curr_frame))
            break

        img = frame[:, :, 0]
        img = img[495:570, :]
        _, img = cv2.threshold(img, 220, 255, cv2.THRESH_BINARY)

        if cal_stderr(img) < 1:
            continue

        if img_count == 0:
            subtitle_img = img
            print('video: %s add subtitle at %d frame.' % (video_filename, curr_frame))
            last_img = img
            img_count += 1
        elif img_count > 10:
            img_count = 0
            subtitle_img = Image.fromarray(subtitle_img)
            save_image(ex_folder, subtitle_img, int(start_frame/fps), int(curr_frame/fps))
            start_frame = curr_frame    # 开始时间往后移
        else:
            if cal_stderr(img, last_img) > 1:
                subtitle_img = np.vstack((subtitle_img, img))
                last_img = img
                img_count += 1
                print('video: %s add subtitle at %d frame.' % (video_filename, curr_frame))
    if img_count > 0:
        subtitle_img = Image.fromarray(subtitle_img)
        save_image(ex_folder, subtitle_img, int(start_frame / fps), int(curr_frame / fps))
    print('video: %s export subtitle finish!' % video_filename)


if __name__ == '__main__':
    video_filename = '/Users/csd/S01E01.mkv'
    export_subtitle(video_filename)

提取的字幕效果如下:

在这里插入图片描述

本文的方法对于电影的此类干扰比较大的视频提取效果达不到最佳,而对于公开课类的视频可以达到很好的效果。对不同类别的视频需要根据1、2节调整参数。

4、对字幕进行文字处理

对提取的字幕进行文字处理可以使用百度 AI 开发平台的 OCR 免费接口,具体可参考我的另一篇博文:Python 利用百度文字识别 API 识别并提取图片中文字

Minecraft 1.18也能用!零编程基础教你配置现成的自动钓鱼脚本(避坑指南) 本文为零基础玩家提供Minecraft 1.18自动钓鱼脚本的详细配置指南,涵盖Python环境搭建、脚本获取与配置、游戏设置适配及故障排查。通过简单步骤实现挂机钓鱼,解放双手获取游戏资源,特别适合不想编程的休闲玩家。 阅读详情

相关推荐

绿色便携式摄像头录像工具VideoCap实战应用

VideoCap是一款专为实时视频采集场景打造的轻量级捕获工具,其核心设计理念聚焦于“高效、稳定、绿色便携”。软件无需安装,双击即可运行,完全不依赖系统注册表,所有配置信息以独立配置文件(如config.ini)形式保存在本地目录,支持U盘即插即用,适用于多设备间无缝迁移。在现代视频捕获系统中,用户对录制质量与资源消耗的平衡提出了更高要求。VideoCap通过提供灵活的录制参数自定义功能——包括分辨率、帧率和比特率的精细化控制——实现了从基础记录到专业级输出的全面覆盖。

weixin_29997223的博客 1605

VideoCap Pro ActiveX控件,视频捕获和图像处理

  VideoCap Pro 是一个 ActiveX 控件,允许开发人员将视频捕获和图像处理功能集成到他们的软件应用程序中。   VideoCap Pro ActiveX 控件包括 VideoCap ActiveX 控件不具备的叠加图片、文本、时间戳目的。VideoCap Pro 是一个 ActiveX 控件,允许开发人员将视频捕获和图像处理功能集成到他们的软件应用程序中。   对于想要查看 IP 摄像机的 Windows 开发人员,包括带有叠加文本、图片、色度键结果、面部检测、运动检测的电影记录,使用

q2315702359的博客 1901

videocap摄像头录像软件

这是一款非常实用而且体积小的录制软件,可以通过PC的摄像头 移动摄像设备 USB摄像头等进行抓拍,还有报警功能!

Python使用PaddleOCR本地进行视频字幕识别

本文简述了利用OpenCV库以及PaddleOCR库对视频预定位置进行字幕提取并整合识别,在实际工程中,可以调用OCR的识别输出接口进行识别内容的批量保存。

cutenew52188的博客 1万+

VideoCap.zip

摄像头预览工具,小巧好用,绿色,能看到摄像头参数,非常好

VideoCapx .6.3 破解版

內含安裝、破解檔,測試ok,保證可用.......

如何快速提取视频文字:videocr完整视频OCR教程指南

在当今数字化时代,视频内容已成为信息传播的重要载体,但其中的文字信息往往难以直接获取和利用。你是否曾经为了一段视频中的关键信息而反复观看,或者为了制作字幕而手动输入大量文字?现在,通过videocr这款专业的视频OCR工具,你可以轻松解决视频文字提取的痛点问题,快速从视频中提取硬编码字幕和文字内容。 ## videocr是什么? **videocr**是一款基于Python的开源视频文字识别工

gitblog_00529的博客 1050

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 394

第八节课 字幕提取

1、/usr/local/Cellar/tesseract/4.1.1/share/tessdata 2、pip3 install pytesseract export TESSDATA_PREFIX=/usr/local/Cellar/tesseract/4.1.1/share/tessdata export PATH=$PATH:$TESSDATA_PREFIX 字幕识别 import pytesseract import cv2 import numpy as np from scipy

princesshu的博客 209

Wireshark实战解析IEC 61850 GOOSE报文:智能变电站通信调试指南

网络协议分析是理解现代工业通信系统的基础,其核心原理在于对数据包的捕获、解码与解析。在电力自动化领域,IEC 61850标准定义了智能变电站内设备间高效、可靠的通信框架,其中GOOSE(通用面向对象变电站事件)协议因其基于以太网多播和快速重传机制,成为保护跳闸、联锁等关键信号传输的基石,其技术价值在于实现了微秒级延迟的高可靠性通信。掌握GOOSE报文的分析能力,对于现场调试、故障定位及系统验证至关重要。本文聚焦于使用Wireshark这一网络分析工具,深入解析GOOSE报文结构,涵盖从以太网帧头、协议标识到

weixin_34401479的博客 376

LM1875官方电路图元件作用解释说明以及电路调校

R1是为C1提供充放电回路用的电阻,这是老外工作严谨的地方,其实接好电位器之后直流通路就已经存在了,这个加上只能防止最恶劣情况时也能把C1的电能放掉,尽管只有一点点 C1是输入电容,主要作用是隔离前后级的直流信号,但是这个电容对音质的影响很大,可以换用不同的品牌和容量来部分修改音质和音色 R2提供LM1875正输入端的直流电平控制点,接地就表示在理想情况下Lm1875的输出直流电平是0V;还有一个作用就是确定放大器的交流输入阻抗为电阻值。 R3、R4是反馈电阻,这个电路的放大倍数为R4/R3+1=21倍。.

m0_50862404的博客 1万+

Python工具箱系列(五十五)

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。从识别效果来看还是不错的。能够看出,识别的可信度还是非常高的。

Trb401012的博客 475

Orin+ GMSL (Ser 9295+Des 9296)流程分析(1)

orin gmsl

乐于分享 2657

class7-字幕提取

一、安装准备 用brew Install安装tesseract 路径:/usr/local/Cellar/tesseract/4.1.1 把语言文件复制到tessdata里 /usr/local/Cellar/tesseract/4.1.1/share/tessdata 安装pytesseract:pip3 install pytesseract 二、配置tesseract环境 在终端输入: export TESSDATA_PREFIX=/usr/local/Cellar/tesserac

m0_58346385的博客 2328

嵌入式工程师必学(118):MCU的硬件定时器和中断

大多数微处理器都有一个或多个可编程硬件定时器,这些定时器包括对中断的支持。可以有不同类型的计时器,用于不同的应用程序。例如,LPC1768 具有四个 32 位通用定时器、一个看门狗定时器、一个重复中断定时器、一个系统滴答定时器、一个正交编码器接口、6 个 PWM 输出和一个支持中断的实时时钟。硬件定时器用于计时和计数作,允许处理器在 timer 进程运行时继续执行其他进程。硬件定时器是一种使用 clock 信号来增加 register 的电路。

码农17年的博客 211

【C语言学习疑难杂症】第20期:0x00007FF7F2821964处引发的异常0xC0000005写入位置 0x0000000000000

检查代码中是否存在野指针访问的情况,确保在进行写入操作之前,内存已经被正确分配或初始化,并且在使用完毕后进行了正确的释放。空指针访问:代码尝试在空指针地址(0x0000000000000000)处进行写入操作,导致访问冲突。检查代码中是否存在数组越界的情况,确保在进行写入操作之前,数组的索引值在合法范围内。检查代码中是否存在空指针访问的情况,确保在进行写入操作之前,指针已经被正确初始化。野指针访问:代码尝试在已释放或未初始化的内存地址进行写入操作,导致访问冲突。

学无止境 828

鼠标悬停翻译神器MouseTooltipTranslator:一键跨越语言障碍的终极解决方案

你是否曾经面对外文网页感到束手无策?阅读学术PDF时被专业术语难住?观看外语视频却看不懂字幕?在全球化信息时代,语言障碍成为获取知识的主要瓶颈。MouseTooltipTranslator正是为解决这一痛点而生的革命性工具,这款强大的浏览器扩展将彻底改变你的跨语言阅读体验,让你轻松掌握50多种语言的即时翻译能力。 ## 🎯 三大核心痛点,一个完美解决方案 ### 痛点一:网页浏览的语言壁垒

gitblog_00048的博客 483

药物代谢仿真软件:PKSim_(6).案例研究与实践应用

通过本章的案例研究和实践应用,我们展示了如何利用PKSim软件构建药物动力学模型、进行参数估计、仿真预测和结果分析。这些方法不仅有助于优化药物代谢研究过程,还可以在药物研发中提供重要的数据支持。通过模型的构建和验证,我们可以更好地理解药物在体内的动态变化过程,为临床试验和药物治疗提供科学依据。

kkchenjj的博客 655

LunaTranslator终极指南:如何快速上手这款强大的游戏翻译工具

你是否曾经因为语言障碍而无法畅玩心爱的视觉小说游戏?🎮 现在有了LunaTranslator,这一切都将成为过去!LunaTranslator是一款专为游戏玩家设计的强大翻译工具,它能够实时翻译游戏中的文本,让你轻松跨越语言障碍,享受全球游戏乐趣。 LunaTranslator支持多种文本获取方式,包括HOOK技术、OCR图像识别和剪贴板读取,配合丰富的翻译引擎,为玩家提供流畅的游戏翻译体验。

gitblog_00486的博客 685

Codex入门00-初识神器(小白入门:到底什么是Codex CLI,和ChatGPT写代码有什么不同?)

OpenAI Codex CLI 是 OpenAI 于2025年推出的终端原生AI编程代理,不是在网页里聊天写代码,而是直接在你的终端里自主读代码、改文件、跑命令。它拥有三种安全模式、/goal 持久化任务、云端沙箱执行等独特能力。本文从零介绍 Codex CLI 的核心概念、与 ChatGPT 写代码的本质区别、典型使用场景和费用说明,让你全面认识这个改变开发方式的神器。

yueyeguzhuo的专栏 302

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Ace-Translate终极指南:如何轻松掌握12种本地离线翻译场景

还在为语言障碍而烦恼吗?想要一款真正保护隐私、功能全面的翻译工具吗?Ace-Translate正是你需要的解决方案!这款基于PaddlePaddle和Torch深度学习的**本地离线翻译程序**,能够在完全离线环境下为你提供12种不同场景的专业翻译服务,彻底告别网络依赖和隐私泄露风险。 ## 🎯 为什么Ace-Translate是你的翻译神器? 在这个数据安全日益重要的时代,**Ace-Tr

gitblog_00611的博客 946

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

AI人工智能方向

图像处理,犬类识别,场景文字识别,人脸算法,图像增强,计算机影像,车型识别,物体检测,黄色图片识别,目标检测API文档Logo检测使用手册,名人识别,车辆分析,显微识别,图像风格化,天空分割,概念识别,图像美学评分,图像质量评估,场所识别,风格迁移,网红人物识别,无限天空,图像视频分析,智能相册,智能贴图,暴力图像识别,场景识别,智能视觉生产,思维导图评估,动漫化身独家,物体识别,内容安全,图像分割,车型识别(含配置参数),猫狗脸技术,图像识别,垃圾分类,图像比对,超清人像独家,图像识别引擎,宝宝检测,图像

m0_59162248的博客 523

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精准视频帧捕获:开源工具 Pilko-Frame-Capture-Studio 使用指南与汉化实践

视频处理中经常需要精准截取某一帧画面,传统播放器截图功能往往不够灵活。本文介绍一款开源的视频帧捕获工具 Pilko-Frame-Capture-Studio,说明其核心功能、适用场景与二次开发潜力。同时,分享我基于该项目进行的汉化与代码重构实践,提供国内可访问的 Gitee 镜像地址,帮助读者快速上手使用。

m0_63773219的博客 363

投屏功能进阶:集成OCR识别与远程控制,打造生产力工具

屏幕镜像技术是实现设备间画面实时传输的基础,其核心原理在于捕获、编码、传输与解码显示。这项技术的价值远不止于简单的画面共享,它为实现更高级的交互与自动化提供了底层通道。通过集成OCR(光学字符识别)引擎,可以实时提取屏幕中的文字信息,实现内容自动化处理;结合ADB(Android调试桥)等系统控制接口,则能构建从“看到”到“操作”的完整交互闭环。这些扩展功能极大地提升了投屏在自动化测试、远程协助、信息提取等工程实践场景中的实用性。本文将以投屏项目为基座,深入探讨如何集成PaddleOCR、EasyOCR等开

weixin_34185320的博客 330

最强图像大模型Phi-3.5-vision实践

大家好,微软推出的Phi-3.5-vision,把人工智能带到了成长的新阶段。这款AI模型擅长处理文本和图像,为图像识别和自动文字识别等任务带来创新的解决思路。本文将介绍Phi-3.5-vision的技术亮点及其在实际场景中的应用。

csdn1561168266的博客 1460
上一篇: Python 爬虫:requests 和 selenium 伪装 headers 和代理应对反爬机制
下一篇: pyspark 实现对列累积求和
XnCSD
博客等级 码龄12年 132粉丝 30原创
评论 39
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值