|
|
|
@ -0,0 +1,46 @@ |
|
|
|
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 |