1
0
mirror of https://gitee.com/sui-feng-cb/AzurLaneAutoScript1 synced 2026-03-09 18:39:04 +08:00
AzurLaneAutoScript/module/base/template.py

90 lines
2.3 KiB
Python
Raw Normal View History

2020-07-24 11:13:23 +08:00
import os
2020-03-29 01:22:46 +08:00
import cv2
2020-07-24 11:13:23 +08:00
import imageio
2020-03-29 01:22:46 +08:00
import numpy as np
from PIL import Image
2020-07-24 11:13:23 +08:00
2020-05-25 22:05:42 +08:00
import module.config.server as server
2020-03-29 01:22:46 +08:00
class Template:
def __init__(self, file):
2020-03-29 01:22:46 +08:00
"""
Args:
2020-05-25 22:05:42 +08:00
file (dict[str], str): Filepath of template file.
2020-03-29 01:22:46 +08:00
"""
2020-05-25 22:05:42 +08:00
self.server = server.server
self.file = file[self.server] if isinstance(file, dict) else file
2020-07-24 11:13:23 +08:00
self.is_gif = os.path.splitext(self.file)[1] == '.gif'
2020-06-29 16:43:24 +08:00
self._image = None
@property
def image(self):
if self._image is None:
2020-07-24 11:13:23 +08:00
if self.is_gif:
self._image = []
for image in imageio.mimread(self.file):
self._image += [image, cv2.flip(image, 1)]
else:
self._image = np.array(Image.open(self.file))
2020-06-29 16:43:24 +08:00
return self._image
@image.setter
def image(self, value):
self._image = value
2020-03-29 01:22:46 +08:00
def match(self, image, similarity=0.85):
2020-03-29 01:22:46 +08:00
"""
Args:
image:
similarity (float): 0 to 1.
2020-03-29 01:22:46 +08:00
Returns:
bool: If matches.
"""
2020-07-24 11:13:23 +08:00
if self.is_gif:
image = np.array(image)
for template in self.image:
res = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
_, sim, _, _ = cv2.minMaxLoc(res)
# print(self.file, sim)
if sim > similarity:
return True
return False
else:
res = cv2.matchTemplate(np.array(image), self.image, cv2.TM_CCOEFF_NORMED)
_, sim, _, _ = cv2.minMaxLoc(res)
# print(self.file, sim)
return sim > similarity
2020-03-29 01:22:46 +08:00
def match_result(self, image):
"""
Args:
image:
Returns:
bool: If matches.
"""
res = cv2.matchTemplate(np.array(image), self.image, cv2.TM_CCOEFF_NORMED)
_, sim, _, point = cv2.minMaxLoc(res)
# print(self.file, sim)
return sim, point
def match_multi(self, image, similarity=0.85):
2020-03-29 01:22:46 +08:00
"""
Args:
image:
similarity (float): 0 to 1.
2020-03-29 01:22:46 +08:00
Returns:
np.ndarray: np.array([[x0, y0], [x1, y1])
2020-03-29 01:22:46 +08:00
"""
result = cv2.matchTemplate(np.array(image), self.image, cv2.TM_CCOEFF_NORMED)
result = np.array(np.where(result > similarity)).T
2020-03-29 01:22:46 +08:00
return result