如何捕捉并处理屏幕上0.2秒闪烁的文字?

问题描述 投票:0回答:1

我正在尝试构建一个Python脚本,它可以检测屏幕上闪烁时间很短(大约0.2秒)的文本。我使用 mss 进行屏幕捕获,使用 pytesseract 进行 OCR。下面是我正在使用的代码:

python
Copy code
import cv2
import pytesseract
import numpy as np
from mss import mss
import time
import threading

# Configure pytesseract path
pytesseract.pytesseract_cmd = "/opt/homebrew/bin/tesseract"

# Define the full-screen capture region
sct = mss()
monitor = sct.monitors[1]  # Full screen (adjust for multiple monitors)

# Initialize variables
last_detected_text = ""
detected_text_lock = threading.Lock()

# Function to capture the screen and process OCR
def capture_and_process_text():
    global last_detected_text
    while True:
        start_time = time.time()
        # Capture the screen
        screenshot = np.array(sct.grab(monitor))
        # Skip grayscale or thresholding for speed
        text = pytesseract.image_to_string(screenshot, lang="eng").strip()
        # Normalize the text to reduce noise
        normalized_text = " ".join(text.split())
        
        # Only display new and non-empty text
        with detected_text_lock:
            if normalized_text and normalized_text != last_detected_text:
                print(f"Detected Text: {normalized_text}")
                last_detected_text = normalized_text
        
        # Dynamically adjust loop timing
        end_time = time.time()
        print(f"Frame processed in {end_time - start_time:.5f} seconds")

# Run the optimized text capture loop
print("Starting full-screen text capture...")
capture_thread = threading.Thread(target=capture_and_process_text)
capture_thread.start()

try:
    while True:
        time.sleep(1)  # Keep the main thread alive
except KeyboardInterrupt:
    print("Text capture stopped.")

这对于捕获和处理屏幕上的文本相当有效,但我面临一些挑战:

速度:有时,脚本似乎不够快,无法捕捉非常短暂的文本闪烁,而我的目标是 0.2 秒左右。 OCR 处理开销:pytesseract 在处理全屏图像时可能会很慢,我想知道是否有办法让它更快。 捕获所有文本:由于我不知道文本将出现在屏幕上的哪个位置,因此我必须捕获整个屏幕,这会增加开销。 我正在寻求有关如何优化此代码以使其更快、更可靠的建议。具体来说:

有没有一种方法可以使屏幕捕获更快,同时仍然处理整个屏幕? 是否有比 pytesseract 更快速且适合实时 OCR 的替代方案? 对于优化捕获然后 OCR 工作流程以处理此类短闪,有什么一般建议吗? 如果您能提供有关如何解决此问题的指导或建议,我将不胜感激。预先感谢!

python ocr tesseract
1个回答
0
投票

您能否识别闪烁发生的地点或时间(即使不是 100% 准确),而无需在整个屏幕上进行完整的 OCR?

比如,这个怎么样:

每个检测间隔(200 毫秒左右),将当前屏幕与前一个屏幕进行廉价比较,以查看是否可能出现文本。假阳性结果可以,但假阴性结果则不然。这必须始终在 200 毫秒的检测间隔内可靠地完成。

如何实现这一点取决于文本的外观以及屏幕上显示的其他内容。例如,如果屏幕是静态的(无动画),您只需查看是否有任何像素发生变化。或者,如果您知道文本或背景有特定的颜色,您可以寻找这些颜色。

当您认为可能出现文本时,请将屏幕的该区域复制到队列中。一个单独的线程将从那里拾取它并执行昂贵的 OCR 部分。

OCR 线程 允许花费比 200 毫秒检测间隔更长的时间,只要平均而言,它能够比快速检测线程插入图像的速度更快地处理队列中的图像。

© www.soinside.com 2019 - 2024. All rights reserved.