Python OCR Tesseract: извлечение меток времени и координат из видеокадровPython

Программы на Python
Ответить
Anonymous
 Python OCR Tesseract: извлечение меток времени и координат из видеокадров

Сообщение Anonymous »

У меня проблема с Python, связанная с распознаванием меток времени/наложений GPS из видеофайлов.
Видеофайлы содержат кадры с камеры, на которых изображены луга с водорослями (см. прикрепленный снимок экрана).
Я хотел бы извлечь дату + время (левая часть кадра), одиночный символ (середина кадра) и координаты (правая часть кадра) и экспортировать их в формате CSV.
Я готов новичок в Python, но сумел вместе с моим другом пообщаться в GPT, чтобы получить сценарий с использованием Tesseract, который пытается выполнить именно это.
Я пробовал различные этапы предварительной обработки, но в конце концов я получил наилучшие результаты, если предварительная обработка ограничивается масштабированием на коэффициент 2 и повышением резкости.
Но CSV по-прежнему содержит много ошибок (см. Выходной CSV).
Особенно 0 против 8, / против 7 или даже различной длины строки являются обычным явлением.
С моей точки зрения «новичка» задача не кажется слишком сложной, потому что, как человек, я вполне способен читать числа без неправильной интерпретации.
Может быть, кто-то уже сталкивался с подобной проблемой и может помочь мне с лучшим сценарием?
Заранее большое спасибо и всего наилучшего!
Филипп
Вот сценарий:
import cv2
import pytesseract
import csv
import os
import numpy as np

# Falls nötig (Windows)
pytesseract.pytesseract.tesseract_cmd = r"C:\Users\Anwender\AppData\Local\Programs\Tesseract-OCR\tesseract.exe"

# Pfade
VIDEO_PATH = "2026-01-03 14-04-48.mp4"
OUTPUT_CSV = "ocr_output_scaled_sharpened.csv"
DEBUG_FOLDER = "ocr_debug_scaled_sharpened"
os.makedirs(DEBUG_FOLDER, exist_ok=True)

# Video laden
cap = cv2.VideoCapture(VIDEO_PATH)
fps = cap.get(cv2.CAP_PROP_FPS)
FRAME_INTERVAL = int(fps) # OCR auf ca. 1 Frame pro Sekunde

# ROIs: (x, y, width, height)
ROI_DATETIME = (12, 844, 246, 16)
ROI_LETTER = (795, 815, 50, 50)
ROI_GPS = (1131, 844, 337, 17)

# Skalierungsfaktor
SCALE_FACTOR = 2 # 2x Vergrößerung

# Schärfungs-Kernel
SHARPEN_KERNEL = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])

def scale_and_sharpen(img, scale_factor=SCALE_FACTOR):
"""Skaliert das Bild hoch und schärft es nach."""
# Hochskalieren
img_scaled = cv2.resize(img, None, fx=scale_factor, fy=scale_factor, interpolation=cv2.INTER_CUBIC)
# Nachschärfen
img_sharpened = cv2.filter2D(img_scaled, -1, SHARPEN_KERNEL)
return img_sharpened

# CSV-Datei öffnen
with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f:
writer = csv.writer(f)
writer.writerow(["frame", "datetime", "letter", "coordinates"]) # Header korrekt geschlossen

frame_id = 0

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

frame_id += 1

# OCR nur auf jedem FRAME_INTERVAL. Spart Zeit
if frame_id % FRAME_INTERVAL != 0:
continue

# ROIs ausschneiden
dt_img = frame[
ROI_DATETIME[1]:ROI_DATETIME[1]+ROI_DATETIME[3],
ROI_DATETIME[0]:ROI_DATETIME[0]+ROI_DATETIME[2]
]
letter_img = frame[
ROI_LETTER[1]:ROI_LETTER[1]+ROI_LETTER[3],
ROI_LETTER[0]:ROI_LETTER[0]+ROI_LETTER[2]
]
gps_img = frame[
ROI_GPS[1]:ROI_GPS[1]+ROI_GPS[3],
ROI_GPS[0]:ROI_GPS[0]+ROI_GPS[2]
]

# Skalieren + Nachschärfen
dt_img_proc = scale_and_sharpen(dt_img)
letter_img_proc = scale_and_sharpen(letter_img)
gps_img_proc = scale_and_sharpen(gps_img)

# Debug-Bilder speichern
cv2.imwrite(os.path.join(DEBUG_FOLDER, f"dt_{frame_id}.png"), dt_img_proc)
cv2.imwrite(os.path.join(DEBUG_FOLDER, f"letter_{frame_id}.png"), letter_img_proc)
cv2.imwrite(os.path.join(DEBUG_FOLDER, f"gps_{frame_id}.png"), gps_img_proc)

# OCR
datetime_text = pytesseract.image_to_string(
dt_img_proc,
config="--psm 7 -c tessedit_char_whitelist=0123456789:/.-"
).strip()

letter_text = pytesseract.image_to_string(
letter_img_proc,
config="--psm 10 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
).strip()

gps_text = pytesseract.image_to_string(
gps_img_proc,
config="--psm 7 -c tessedit_char_whitelist=0123456789.NSEW,-"
).strip()

# In CSV schreiben
writer.writerow([frame_id, datetime_text, letter_text, gps_text])

cap.release()
print("OCR abgeschlossen. Debug-Bilder im Ordner:", DEBUG_FOLDER)


Подробнее здесь: https://stackoverflow.com/questions/798 ... ideo-frame
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»