python视频ocr字幕识别浅尝经历

这里写自定义目录标题


想做一个视频 ocr 字幕识别,看到论坛里有,结果没成功
这里借鉴的是该文章的代码

Python - 利用 OCR 技术提取视频台词、字幕


```python
from moviepy.editor import *

# 对视频进行裁剪与缩放
clip = VideoFileClip('G:/无量寿经/无量寿经第三回/1.MP4')
print("Ori FPS:{} Duration:{} Height:{} Width:{}".format(clip.fps, clip.duration, clip.w, clip.h))

cut_clip = clip.crop(y2=clip.h - 11, height=70)
cut_clip = cut_clip.set_fps(3)
print("Cut FPS:{} Duration:{} Height:{} Width:{}".format(cut_clip.fps, cut_clip.duration, cut_clip.w, cut_clip.h))
epoch = 10
step = cut_clip.duration / epoch

epoch = 10
step = cut_clip.duration / epoch
cut_clip.write_videofile("G:/无量寿经/无量寿经第三回/裁剪/1cropped.MP4")


# 截取多个片段
clips = []
index = 0
while index < epoch:
    # 获取分段的起止时间
    start = index * step
    end = min(start + step, clip.duration)

    if start < clip.duration:
        sub_clip = cut_clip.subclip(start, end)
        print("index: {} start: {} end: {}".format(index, start, end))
        clips.append([start, sub_clip])
        # 指定保存的子片段视频文件的名字
        output_file = "G:/无量寿经/无量寿经第三回/裁剪/sub_clip_{}.mp4".format(index)

        # 将子片段保存为视频文件
        sub_clip.write_videofile(output_file, codec='libx264', audio_codec='aac')
    else:
        break
    index += 1


裁剪视频,获得字幕处的位置,切片保存也是成功的。

在这里插入图片描述

但是识别代码运行后无任何反应

def process_frame_by_ocr(st, tmp_clip):
        ocr = PaddleOCR(use_angle_cls=True, lang="ch", use_gpu=True)
        frame_rate = 1 / 3

        for cnt, cur_frame in enumerate(tmp_clip.iter_frames()):
            cur_start = frame_rate * (cnt + 1) + st

            try:
                # det=True 表示在进行光学字符识别(OCR)之前,先对图像进行检测。
                result = ocr.ocr(cur_frame, det=True)
                if result is not None:
                    see = result[0][0][1]
                    cur_time = int(cur_start)
                    doc_json = {'st': cur_time, "text": see}
                    ocr_text = json.dumps(doc_json, ensure_ascii=False)
                    open('result.json', 'a', encoding='utf-8').write(ocr_text + '\n')
            except Exception:
                pass


#import os
print(os.getcwd())#

运行结果如下
在这里插入图片描述
没有识别到文字
后来用ai 给的一段代码,可以识别,但是常有错别字,总体来说效果不好。下面是代码及运行结果

这里说一下 ,下面这个需要安装tesseract,下载地址:添加链接描述

import cv2
import pytesseract

# 配置Tesseract的路径
pytesseract.pytesseract.tesseract_cmd = r'D:\Program Files (x86)\Tesseract-OCR\tesseract.exe'  # 根据实际情况修改

# 打开视频
cap = cv2.VideoCapture('G:/无量寿经/无量寿经第三回/裁剪/sub_clip_1.MP4')

# 检查视频是否打开
if not cap.isOpened():
    print("Error: Could not open video.")
    exit()

# 逐帧读取视频
while True:
    # 读取视频帧
    ret, frame = cap.read()
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break

    # 转换为灰度图像
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    _, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

    text = pytesseract.image_to_string(gray,lang='chi_tra')

    # 打印提取的字幕
    print(text)

    # 显示视频帧
    cv2.imshow('frame', frame)
    if cv2.waitKey(1) == ord('q'):  # 按'q'键退出
        break

# 释放视频对象
cap.release()
cv2.destroyAllWindows()

运行结果
在这里插入图片描述

以上就是近几天ocr字幕的测试,总体来说识别还是不好,特别是繁体字
不知道有没有哪位大神能指导下!~

中间还用了一位大神的操作指引运行后也是无反应,不知道问题出在哪里
python基于ocr的视频字幕提取

from PIL import Image
import cv2 as cv
import pytesseract
import threading


def video_handle():
    while 1:
        name = input("请将本软件与视频放在统一目录下并输入文件名,要有后缀例如 小明.mp4\n并且将会生成字幕文件。\n")
        fxy = input("请输入视频显示时缩放程度,建议0.5-0.6 太小的数字识别度不高 例如:0.5\n")
        if name == "" and fxy == "":
            print("不允许为空")
            continue
        break
    file_name = name
    # 获取视频
    cap = cv.VideoCapture(r"{}".format(name))
    # 初始化帧率控制 左上右下
    n = x = y = w = h = 0
    # 区域
    roi = None

    while cap.isOpened():
        # cap.read()
        # 视频流读取
        flag, frame = cap.read()

        if flag is False:
            break
        # 根据输入重设大小
        frame = cv.resize(frame, (0, 0), fx=float(fxy), fy=float(fxy))
        # 以20的帧率识别
        if n % 20 == 0:
            # 初始化范围
            if n == 0:
                if input("输入1则自选区域,建议根据实际视频字幕区域选择,尽量区域选择全面\n") == "1":
                    # 选择范围框
                    roi = pic_range(frame)
                    # 保存位置
                    x, y, w, h = roi
                else:
                    # 默认选区
                    x, y, w, h = 405, 971, 1194, 75
                print("字幕范围", x, y, w, h)

            # 长方形范围框
            if n > 0:
                cv.rectangle(img=frame, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)

            # 区域内图像裁剪
            range_pic = frame[y:y + h, x:x + w]
            # 高斯滤波降噪
            throw_nosiy = cv.GaussianBlur(range_pic, (5, 5), 0)
            # 灰度
            GrayImage = cv.cvtColor(throw_nosiy, cv.COLOR_BGR2GRAY)

            # 二值化
            ret, thresh = cv.threshold(GrayImage, 127, 255, cv.THRESH_BINARY)
            cv.imshow("word", thresh)
            cv.imshow("pic", frame)
            # 转化为pil图片模式
            image = Image.fromarray(cv.cvtColor(thresh, cv.COLOR_BGR2RGB))
            # 识别
            pic_str(image, file_name)

        # q键退出
        if ord('q') == cv.waitKey(3):
            break
        n = n + 1
    cv.destroyAllWindows()
    # 释放摄像头
    cap.release()

def pic_str(image, file_name):
    # tesseract ocr
    chi_text = pytesseract.image_to_string(image, lang="chi_sim")
    # 移除多余的空格与换行
    chi_text = chi_text.replace(" ", "").replace("\n", "")
    if chi_text != "":
        print(chi_text)
        # 创建进程写入
        thread = threading.Thread(target=file_save, args=(chi_text, file_name))
        thread.start()
def pic_range(img):
    # 范围选择
    roi = cv.selectROI(windowName="roi", img=img, showCrosshair=True, fromCenter=False)
    cv.destroyAllWindows()
    return roi
def file_save(chi_text, file_name):
    with open("{}.txt".format(file_name), "a+") as f:
        f.write(chi_text + "\n")

运行结果也是没反应,也不报错
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值