Model-Free Text-Region Detection (MSER)

shape_locator finds rectangular contours (buttons / cards, not text) and locate_text needs a Tesseract / Paddle engine and the exact string to search for. Neither answers “where is there any text on screen?” without running OCR or knowing the words. find_text_regions and find_text_lines use MSER (Maximally Stable Extremal Regions) to find the glyph / word / line blobs, so a script can crop the candidate text boxes to feed OCR — far faster and more accurate than full-frame OCR — or simply detect that a label appeared with no OCR dependency installed.

Runs on an injectable haystack (ndarray / path / PIL), so it is headless-testable on synthetic arrays. cv2.MSER_create is base OpenCV (no contrib); OpenCV + NumPy come in via je_open_cv. Imports no PySide6.

Headless API

from je_auto_control import find_text_regions, find_text_lines

# Crop each text line and OCR just that strip.
for line in find_text_lines(y_tolerance=8):
    text = locate_text  # ... feed the cropped region to your OCR of choice
    print(line["x"], line["y"], line["width"], line["height"])

# Or per-glyph / per-word regions.
for box in find_text_regions(min_area=80):
    highlight(box["x"], box["y"], box["width"], box["height"])

find_text_regions returns {x, y, width, height, area, center} per region, largest first; merge unions MSER’s nested per-glyph detections, min_area / max_area drop specks and page-sized blobs, max_aspect rejects long thin rules. find_text_lines groups glyph boxes whose vertical centres are within y_tolerance pixels into one box per line, top-to-bottom. A blank screen returns an empty list (the whole-frame extremal region is filtered out).

Executor commands

AC_find_text_regions (min_area / max_area / merge / max_aspect / region{count, regions}) and AC_find_text_lines (y_tolerance / region{count, lines}). They are exposed as the MCP tools ac_find_text_regions / ac_find_text_lines and as Script Builder commands under Image.