You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.3 KiB

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