我正在尝试构建一个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 工作流程以处理此类短闪,有什么一般建议吗? 如果您能提供有关如何解决此问题的指导或建议,我将不胜感激。预先感谢!
您能否识别闪烁发生的地点或时间(即使不是 100% 准确),而无需在整个屏幕上进行完整的 OCR?
比如,这个怎么样:
每个检测间隔(200 毫秒左右),将当前屏幕与前一个屏幕进行廉价比较,以查看是否可能出现文本。假阳性结果可以,但假阴性结果则不然。这必须始终在 200 毫秒的检测间隔内可靠地完成。
如何实现这一点取决于文本的外观以及屏幕上显示的其他内容。例如,如果屏幕是静态的(无动画),您只需查看是否有任何像素发生变化。或者,如果您知道文本或背景有特定的颜色,您可以寻找这些颜色。
当您认为可能出现文本时,请将屏幕的该区域复制到队列中。一个单独的线程将从那里拾取它并执行昂贵的 OCR 部分。
OCR 线程 允许花费比 200 毫秒检测间隔更长的时间,只要平均而言,它能够比快速检测线程插入图像的速度更快地处理队列中的图像。