import cv2 import numpy as np import base64 from io import BytesIO from PIL import Image def base64_to_cv2(base64_str: str): """ 将 base64 字符串解码为 OpenCV 图像 """ image_data = base64.b64decode(base64_str) image = Image.open(BytesIO(image_data)).convert('RGB') return cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR) def get_slide_offset_from_base64(bg_base64: str, slider_base64: str, debug=False) -> int: """ 从 Base64 图像中计算滑动距离 """ # 解码 base64 为图像 bg_img = base64_to_cv2(bg_base64) slider_img = base64_to_cv2(slider_base64) # 转灰度图 bg_gray = cv2.cvtColor(bg_img, cv2.COLOR_BGR2GRAY) slider_gray = cv2.cvtColor(slider_img, cv2.COLOR_BGR2GRAY) # 边缘检测 bg_edge = cv2.Canny(bg_gray, 100, 200) slider_edge = cv2.Canny(slider_gray, 100, 200) # 模板匹配 result = cv2.matchTemplate(bg_edge, slider_edge, cv2.TM_CCOEFF_NORMED) _, max_val, _, max_loc = cv2.minMaxLoc(result) x, y = max_loc if debug: print(f"[DEBUG] 最大匹配值: {max_val:.4f} 位置: ({x}, {y})") h, w = slider_gray.shape vis = bg_img.copy() cv2.rectangle(vis, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.imshow("Match Result", vis) cv2.waitKey(0) cv2.destroyAllWindows() return x