局部動態 / 活動偵測

三個相近鄰居,各有區別:wait_until_screen_stable 在即時輪詢迴圈上回傳*布林值*(不是對可注入配對的局部方框); ssim_changed_regions 是*結構性*的(高斯視窗 SSIM、耐光照——刻意忽略你想抓的快速像素動態);``diff_screenshots`` 標示像素差但不以活動區塊 + 分數呈現。changed_regions / has_motion / activity_score 是便宜的 absdiff 路徑:兩幀之間哪些子區域在*移動*,讓腳本能挑選安靜區域或定位忙碌的轉圈動畫。

它們在兩個可注入的幀(ndarray / 路徑 / PIL)上運作,因此可對合成陣列做無頭測試,並沿用共用的連通元件輔助函式。 OpenCV + NumPy 透過 je_open_cv 引入。不匯入 PySide6

無頭 API

from je_auto_control import changed_regions, has_motion, activity_score

before = screenshot_to_array()
# ... 經過一段時間 ...
for box in changed_regions(before, after):     # 移動的方框,由大到小
    print(box["x"], box["y"], box["width"], box["height"])

if has_motion(before, after):
    print("still animating, activity =", activity_score(before, after))

changed_regions 對絕對差做門檻(threshold)、去噪(blur)、膨脹,回傳至少 min_area{x, y, width, height, area, center} 區塊,由大到小。has_motion 是布林形式;``activity_score`` 是移動像素的 比例(0..1)。不同尺寸的幀會丟出 ValueError

執行器命令

AC_changed_regions``(``before / after / threshold / min_area / blur{count, regions})與 AC_has_motion``(``before / after / threshold / min_area{moved, activity});``after`` 預設為 即時螢幕擷取。它們以 MCP 工具 ac_changed_regions / ac_has_motion 以及 Script Builder 中 Image 分類下的 命令提供。