首页 > 编程问答 >我必须每秒捕获一帧的时间戳,但无法捕获整个事件。我能得到的最接近日期是“YYYY-MM-DD”中的日期

我必须每秒捕获一帧的时间戳,但无法捕获整个事件。我能得到的最接近日期是“YYYY-MM-DD”中的日期

时间:2024-07-31 12:49:55浏览次数:15  
标签:python opencv python-tesseract

我正在尝试从左上角的一帧速率的视频中获取时间戳。 我只能得到日期,不能得到整个时间戳。帮我获取整个时间戳 我正在共享一个在预处理视频后得到的窗口。

我本来希望获得整个时间戳,但我无法做到。 我想要一个 json 文件中的整个时间戳,例如“2024-03-29 16:36:20”,并且每个帧都会发生变化 像例如。 帧 1 - “2024-03-29 16:36:20” 帧 54 - “2024-03-29 16:36:21” 帧 140 - “2024-03-29 16:36:22” 等等 我的代码 -

import cv2
import pytesseract
import json
import re


pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'


def extract_timestamp(frame):

    roi = frame[0:50, 0:550]

    gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    custom_config = r'--oem 3 --psm 7'
    text = pytesseract.image_to_string(gray, config=custom_config)

    # cv2.imshow('ROI', gray)
    # cv2.waitKey(1)

    match = re.search(r'\d{4}-\d{2}-\d{2}', text)
    if match:
        return match.group(0)
    else:
        return " "


def process_video(video_path, output_video_path, json_output_path):

    cap = cv2.VideoCapture(video_path)

    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))

    if not cap.isOpened():
        print("Error: Could not open video.")
        return

    frame_count = 0
    timestamps = []

    while cap.isOpened():
        ret, frame = cap.read()

        if not ret:
            break

        if frame_count % int(fps) == 0:  # One frame per second
            timestamp = extract_timestamp(frame)
            if timestamp:
                print(f"Frame {frame_count}: {timestamp}")

                cv2.putText(frame, timestamp, (10, height - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1,
                            cv2.LINE_AA)

                timestamps.append({'frame': frame_count, 'timestamp': timestamp})
            else:
                print(f"Frame {frame_count}: No timestamp detected")


        out.write(frame)

        frame_count += 1

    cap.release()
    out.release()

    with open(json_output_path, 'w') as json_file:
        json.dump(timestamps, json_file, indent=4)


video_path = r"C:\Users\Ayush Thakur\Desktop\projects\timestamp\vid.mov"
output_video_path = 'output_annotated_video.mp4'
json_output_path = 'timestamps.json'


process_video(video_path, output_video_path, json_output_path)


你几乎做到了!你面临的挑战是如何在你只有起始日期和帧速率的情况下推断每个帧的确切时间。

由于你能够每秒获取一帧时间戳,下面是如何生成所需 JSON 时间戳的方法:

import cv2
import pytesseract
import json
import re
from datetime import datetime, timedelta

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'


def extract_timestamp(frame):
    roi = frame[0:50, 0:550]

    gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
    gray = cv2.GaussianBlur(gray, (5, 5), 0)
    gray = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
    custom_config = r'--oem 3 --psm 7'
    text = pytesseract.image_to_string(gray, config=custom_config)

    match = re.search(r'\d{4}-\d{2}-\d{2}', text)
    if match:
        return match.group(0)
    else:
        return " "


def process_video(video_path, output_video_path, json_output_path):
    cap = cv2.VideoCapture(video_path)

    fps = cap.get(cv2.CAP_PROP_FPS)
    width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
    height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    out = cv2.VideoWriter(output_video_path, fourcc, fps, (width, height))

    if not cap.isOpened():
        print("错误:无法打开视频。")
        return

    frame_count = 0
    timestamps = []
    base_timestamp = None  # 存储初始时间戳

    while cap.isOpened():
        ret, frame = cap.read()

        if not ret:
            break

        if frame_count % int(fps) == 0:  # 每秒一帧
            timestamp_str = extract_timestamp(frame)
            if timestamp_str:
                if base_timestamp is None:  # 初始化基本时间戳
                    base_timestamp = datetime.strptime(timestamp_str, "%Y-%m-%d")
                    base_timestamp = base_timestamp.replace(hour=0, minute=0, second=0) #确保从 00:00:00 开始

                timestamp = base_timestamp + timedelta(seconds=frame_count // fps) 
                timestamp_formatted = timestamp.strftime("%Y-%m-%d %H:%M:%S") # 格式化时间戳

                print(f"帧 {frame_count}: {timestamp_formatted}")
                cv2.putText(frame, timestamp_formatted, (10, height - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 1, cv2.LINE_AA)
                timestamps.append({'frame': frame_count, 'timestamp': timestamp_formatted})
            else:
                print(f"帧 {frame_count}: 未检测到时间戳")

        out.write(frame)
        frame_count += 1

    cap.release()
    out.release()

    with open(json_output_path, 'w') as json_file:
        json.dump(timestamps, json_file, indent=4)


video_path = r"C:\Users\Ayush Thakur\Desktop\projects\timestamp\vid.mov"
output_video_path = 'output_annotated_video.mp4'
json_output_path = 'timestamps.json'

process_video(video_path, output_video_path, json_output_path)

说明:

  1. 导入 datetime timedelta 这些模块用于处理日期和时间计算。
  2. base_timestamp 此变量存储从提取的日期创建的初始时间戳,初始化为 00:00:00。
  3. 增量时间戳:
  4. 对于每个帧,我们通过将总秒数( frame_count // fps )添加到 base_timestamp 来计算时间戳。
  5. timedelta(seconds=frame_count // fps) 创建一个表示当前帧的持续时间的 timedelta 对象。
  6. 然后我们添加这个 timedelta base_timestamp 以获得该特定帧的精确时间戳。
  7. 格式化: 使用 strftime("%Y-%m-%d %H:%M:%S") 将计算出的时间戳格式化为所需的字符串格式。

现在,你的代码应该为每个帧生成准确的时间戳,并将其存储在所需的 JSON 文件中。

如果你的视频跨越多天,此代码假定它是在 24 小时内录制的。 如果不是,则需要添加逻辑来检测日期变化,并在必要时更新 base_timestamp

标签:python,opencv,python-tesseract
From: 78814461

相关文章

  • 探索 Python 的广泛应用:从开发到数据科学
    目录引言Python的发展历史Python的特点Python在Web开发中的应用Django框架Flask框架其他Web框架Python在数据科学中的应用数据分析机器学习深度学习Python在自动化和脚本编写中的应用系统管理和自动化网络爬虫Python在游戏开发中的应用PygamePython在......
  • 碰撞检测 | 矩形增量膨胀安全走廊模型(附C++/Python仿真)
    目录0专栏介绍1安全走廊建模的动机2矩形增量膨胀算法3算法仿真3.1C++实现3.2Python实现0专栏介绍......
  • python - 构建奇点容器时在 pyproject.toml 中找不到 [tool.poetry] 部分
    我正在尝试构建一个在HPC环境上运行的奇点容器。我正在使用poetry来管理python包。我的pyproject.toml文件的内容如下:[tool.poetry]name="haqc"version="0.1.0"description=""authors=["VivekKatial<[email protected]>"......
  • 如何在Python中处理FileNotFoundException
    我有一个函数可以从路径读取avro文件(按日文件夹)并将其写入相同的路径(聚合到按月的文件夹)。如果文件夹有.avro文件,该函数可以正常工作。但如果文件夹为空,我会收到错误。java.io.FileNotFoundException:Noavrofilesfound.Iffilesdon'thave.avroextension,set......
  • 有谁知道如何在 ROS 中使用 python 开发赛车模拟编码?
    在模拟中,主要目标是让自动驾驶汽车读取AprilTags并根据标牌提供的说明进行导航。AprilTags是一种基准标记,可作为重要的视觉提示,传达有关汽车周围环境的信息,例如方向、速度限制和其他关键路标。汽车的车载视觉系统应该检测这些标签,解码嵌入的数据,并相应地调整其运动。这包括在......
  • python实现提取视频帧的图片
    文章目录1、需求痛点2、完整代码⭐3、代码分析3.1、需要改动的地方3.2、OpenCV库的使用3.3、多线程技术4、执行效率5、效果展示⭐6、注意事项......
  • 三种语言实现差分(C++/Python/Java)
    题目输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整数l,r,c表示将序列中[l,r]之间的每个数加上c。请你输出进行完所有操作后的序列。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数序列。接下来m行,每行包含三个整数l,r,c,表......
  • Python编程的16个坏习惯
    1、手动进行字符串格式化#坏习惯name="Alice"greeting = "Hello, " + name +"!" #好习惯name="Alice"greeting=f"Hello,{name}!" 理由:使用+进行字符串拼接会导致代码可读性差,而且在复杂情况下容易出错,f-string可读性更好 2、手动关闭文件#坏习惯......
  • Flask框架入门:快速搭建轻量级Python网页应用
    转载: Flask框架入门:快速搭建轻量级Python网页应用1. Flask基础Flask是一个使用Python编写的轻量级Web应用框架。它的设计目标是让Web开发变得快速简单,同时保持应用的灵活性。Flask依赖于两个外部库:Werkzeug和Jinja2,Werkzeug作为WSGI工具包处理Web服务的底层细节,Jinja2作为......
  • 我有一个“pywhatkit”python 模块属性错误。你能帮我吗?
    Pywhatkit已成功安装,但在任何属性代码中都显示属性错误。我可以修复它吗?我尝试过的代码:importpywhatkitpywhatkit.sendmsg('071*******','Ado',15,48)我如何修复这个问题:我将程序文件名“pywhatkit.py”重命名为“anotername.py”。谢谢所有帮......