В настоящее время я работаю над python сценарием, где я сравниваю изображение (скриншот), которое я делаю, а затем обрезаю его вокруг моей мыши. Затем сравните это изображение с «библиотекой / базой данных» изображений в папке, затем он возвращает наиболее похожее изображение и находит правильные данные для этого изображения, для которого я создал базу данных Json.
В основном Я пытаюсь выяснить, что делает конкретный элемент c в популярной игре «The Binding Of Isaa c». Я снимаю изображение с экрана и, как сказано, сравниваю его с библиотекой изображений. Затем найдите в базе данных .json
имя этого изображения и выясните, что оно делает. В настоящее время я использую метод cv2.matchTemplate()
от openCV, проблема в том, что этот метод сравнивает только фигуры, а не цвета. В упомянутой игре много похожих фигур, и самое большое отличие - это цвет. Поэтому я подумал, какой метод / функцию мне следует использовать для этого.
Извините за плохую грамматику, английский sh не мой родной язык.
Метод обрезки изображения:
def crop_image(image_path):
sprite = cv2.imread(image_path)
sprite_resized = cv2.resize(sprite,(0,0),fx=10,fy=10) # resize for visualisation purposes
sprite_gray = cv2.cvtColor(sprite_resized, cv2.COLOR_BGR2GRAY)
sprite_canny = cv2.Canny(sprite_gray, 60,30,3,3) # <- play around with these params.
sprite_canny = sprite_canny.astype(np.bool) # is now a masked array
# because sprite_canny is a masked array, we can change the pixels in the sprite_resized
# to a different color to display the result. here the canny edges are shown in red
sprite_resized[sprite_canny] = (0,0,255)
# clever part: get the ranges of the bounding x and y coordinates. for this, we can use
# .any(axis = 0 or 1) to check if there's a point along the x or y axis. read as: "any
# point along axis 0 or 1?"
mx = sprite_canny.any(axis = 0)
my = sprite_canny.any(axis = 1)
# with this, we can get the range of x and y coordinate and get the min and max from them.
# to calculate the range, we need the width and height in pixels, accessed using .shape
h, w = sprite_gray.shape
rx = np.arange(w)[mx]
ry = np.arange(h)[my]
x_min = np.min(rx)
y_min = np.min(ry)
x_max = np.max(rx)
y_max = np.max(ry)
#COMMENT OUT RETURN TOO SE DEFAULT SCRIPT
return cv2.resize(sprite_gray[y_min:y_max, x_min:x_max], IMAGE_SIZE)
# use these coordinates to display a green rectangle around the found sprite
cv2.rectangle(sprite_resized, (x_min,y_min), (x_max,y_max), (0,255,0), 2)
Метод сравнения изображений:
def compare_images(image, library):
value = 0
max_value = 0
compared_image = str()
for file in os.listdir(library):
template = f'{library}\\{file}'
try:
template = crop_image(template)
value = cv2.matchTemplate(image, template, method=cv2.TM_CCOEFF)[0][0]
except Exception: pass
if value > max_value:
max_value = value
compared_image = file
return max_value, compared_image