From d362b9e2c8975dd13fee23701cf2b4ec0173a2cc Mon Sep 17 00:00:00 2001 From: Thaloria Date: Mon, 16 May 2022 14:57:15 +0200 Subject: [PATCH] re-implement equipment with masks --- equipment_main.py | 222 +++++++++++++++++++++++----------------------- vision.py | 19 +++- 2 files changed, 128 insertions(+), 113 deletions(-) diff --git a/equipment_main.py b/equipment_main.py index c2426c9..6b3e9b3 100644 --- a/equipment_main.py +++ b/equipment_main.py @@ -134,9 +134,9 @@ def run(): rectangles = vision_stun.find_by_mask_and_validate(screenshot, needles[rer], masks[rer], 5) # draw the detection results onto the original image - #output_image = vision_stun.draw_rectangles(screenshot, rectangles) - #cv.imshow("output_image", output_image) - #cv.waitKey(150) + # output_image = vision_stun.draw_rectangles(screenshot, rectangles) + # cv.imshow("output_image", output_image) + # cv.waitKey(150) if len(rectangles) is not 5: break @@ -173,6 +173,114 @@ def run(): cv.waitKey(150) +def check_and_move_tile(capture_win, visio, conf, rect, needl, hsv, tresh, mask, point_source, point_dest): + screenshot_pos = capture_win.get_screenshot() + w = rect[0] + h = rect[1] + x = rect[2] + y = rect[3] + screenshot_pos = screenshot_pos[y:y + h, x:x + w] # (w, h, x+w, y+h) + # processed_screenshot = visio.apply_hsv_filter(screenshot_pos, hsv) + # processed_needle = visio.apply_hsv_filter(needl, hsv) + result2 = cv.matchTemplate(screenshot_pos, needl, cv.TM_CCOEFF_NORMED) + _minVal2, _maxVal2, minLoc2, maxLoc2 = cv.minMaxLoc(result2, None) + # rectangles2 = visio.find(screenshot_pos, needl, tresh, 1, True, mask) + # output_by_area = vision_stun.draw_rectangles(screenshot_pos2, rectangles) + # cv.imshow("output_image_by_area", screenshot_pos) + # cv.waitKey(150) + print("thresh in movecheck:" + str(_maxVal2)) + if _maxVal2 <= 0.9: + move_tile(conf, point_source, point_dest) + + +def click_point(conf, x, y): + offset_left = conf.returnEquipmentWindowPos()[2] + offset_down = conf.returnEquipmentWindowPos()[3] + pydirectinput.moveTo(x + offset_left, y + offset_down) + pydirectinput.mouseDown() + w = random.randint(1, 50) + cv.waitKey(30 + w) + pydirectinput.mouseUp() + + +def move_tile(conf, point_source, point_dest): + offset_left = conf.returnEquipmentWindowPos()[2] + offset_down = conf.returnEquipmentWindowPos()[3] + pydirectinput.moveTo(point_source[0] + offset_left, point_source[1] + offset_down) + pydirectinput.mouseDown() + w = random.randint(1, 50) + cv.waitKey(100 + w) + pydirectinput.moveTo(point_dest[0] + offset_left, point_dest[1] + offset_down) + pydirectinput.mouseUp() + cv.waitKey(500) + + +def find_emitter(emitter_to_use, vis, screen, layer): + if emitter_to_use == EMITTER_MUSH: + if layer == 0: + needle = cv.imread("equip/emitters/mush_e_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/mush_e_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/mush_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/mush_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.98, 1, True, mask) + elif emitter_to_use == EMITTER_AMU: + if layer == 0: + needle = cv.imread("equip/emitters/amu_e_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/amu_e_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/amu_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/amu_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + elif emitter_to_use == EMITTER_MAIN: + if layer == 0: + needle = cv.imread("equip/emitters/main_e1_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/main_e1_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/main_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/main_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + elif emitter_to_use == EMITTER_SWORD: + if layer == 0: + needle = cv.imread("equip/emitters/sword_e1_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/sword_e1_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/sword_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/sword_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.98, 1, True, mask) + elif emitter_to_use == EMITTER_STAFF: + if layer == 0: + needle = cv.imread("equip/emitters/staff_e1_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/staff_e1_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/staff_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/staff_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.99, 1, True, mask) + elif emitter_to_use == EMITTER_RING: + if layer == 0: + needle = cv.imread("equip/emitters/ring_e1_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/ring_e1_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/ring_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/ring_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + elif emitter_to_use == EMITTER_WAND: + if layer == 0: + needle = cv.imread("equip/emitters/wand_e1_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/wand_e1_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.95, 1, True, mask) + else: + needle = cv.imread("equip/emitters/wand_e2_32.jpg", cv.IMREAD_UNCHANGED) + mask = cv.imread("equip/emitters/wand_e2_32-mask.png", cv.IMREAD_COLOR) + return vis.find(screen, needle, 0.96, 1, True, mask) + + def include_chests(needles, hsv, tresh, mask): needles.append(cv.imread("equip/chests/chest_1_32.jpg", cv.IMREAD_UNCHANGED)) hsv.append(HSV_DEFAULT) @@ -529,113 +637,5 @@ def include_wands(needles, hsv, tresh, mask): mask.append(cv.imread("equip/wands/wand_4_32-mask.png", cv.IMREAD_COLOR)) -def move_tile(conf, point_source, point_dest): - offset_left = conf.returnEquipmentWindowPos()[2] - offset_down = conf.returnEquipmentWindowPos()[3] - pydirectinput.moveTo(point_source[0] + offset_left, point_source[1] + offset_down) - pydirectinput.mouseDown() - w = random.randint(1, 50) - cv.waitKey(100 + w) - pydirectinput.moveTo(point_dest[0] + offset_left, point_dest[1] + offset_down) - pydirectinput.mouseUp() - cv.waitKey(500) - - -def find_emitter(emitter_to_use, vis, screen, layer): - if emitter_to_use == EMITTER_MUSH: - if layer == 0: - needle = cv.imread("equip/emitters/mush_e_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/mush_e_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/mush_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/mush_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.98, 1, True, mask) - elif emitter_to_use == EMITTER_AMU: - if layer == 0: - needle = cv.imread("equip/emitters/amu_e_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/amu_e_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/amu_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/amu_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - elif emitter_to_use == EMITTER_MAIN: - if layer == 0: - needle = cv.imread("equip/emitters/main_e1_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/main_e1_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/main_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/main_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - elif emitter_to_use == EMITTER_SWORD: - if layer == 0: - needle = cv.imread("equip/emitters/sword_e1_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/sword_e1_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/sword_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/sword_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.98, 1, True, mask) - elif emitter_to_use == EMITTER_STAFF: - if layer == 0: - needle = cv.imread("equip/emitters/staff_e1_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/staff_e1_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/staff_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/staff_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.99, 1, True, mask) - elif emitter_to_use == EMITTER_RING: - if layer == 0: - needle = cv.imread("equip/emitters/ring_e1_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/ring_e1_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/ring_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/ring_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - elif emitter_to_use == EMITTER_WAND: - if layer == 0: - needle = cv.imread("equip/emitters/wand_e1_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/wand_e1_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.95, 1, True, mask) - else: - needle = cv.imread("equip/emitters/wand_e2_32.jpg", cv.IMREAD_UNCHANGED) - mask = cv.imread("equip/emitters/wand_e2_32-mask.png", cv.IMREAD_COLOR) - return vis.find(screen, needle, 0.96, 1, True, mask) - - -def check_and_move_tile(capture_win, visio, conf, rect, needl, hsv, tresh, mask, point_source, point_dest): - screenshot_pos = capture_win.get_screenshot() - w = rect[0] - h = rect[1] - x = rect[2] - y = rect[3] - screenshot_pos = screenshot_pos[y:y+h, x:x+w] # (w, h, x+w, y+h) - # processed_screenshot = visio.apply_hsv_filter(screenshot_pos, hsv) - # processed_needle = visio.apply_hsv_filter(needl, hsv) - result2 = cv.matchTemplate(screenshot_pos, needl, cv.TM_CCOEFF_NORMED) - _minVal2, _maxVal2, minLoc2, maxLoc2 = cv.minMaxLoc(result2, None) - # rectangles2 = visio.find(screenshot_pos, needl, tresh, 1, True, mask) - # output_by_area = vision_stun.draw_rectangles(screenshot_pos2, rectangles) - #cv.imshow("output_image_by_area", screenshot_pos) - #cv.waitKey(150) - print("thresh in movecheck:" + str(_maxVal2)) - if _maxVal2 <= 0.9: - move_tile(conf, point_source, point_dest) - - -def click_point(conf, x, y): - offset_left = conf.returnEquipmentWindowPos()[2] - offset_down = conf.returnEquipmentWindowPos()[3] - pydirectinput.moveTo(x + offset_left, y + offset_down) - pydirectinput.mouseDown() - w = random.randint(1, 50) - cv.waitKey(30 + w) - pydirectinput.mouseUp() - - if __name__ == "__main__": run() diff --git a/vision.py b/vision.py index 217f8b8..02118c4 100644 --- a/vision.py +++ b/vision.py @@ -72,12 +72,18 @@ class Vision: return keep_rects - def find(self, haystack_img, needle_img, threshold=0.5, max_results=10): + + def find(self, haystack_img, needle_img, threshold=0.5, max_results=10, normalize=False, mask=None): # run the OpenCV algorithm needle_w = needle_img.shape[1] needle_h = needle_img.shape[0] - result = cv.matchTemplate(haystack_img, needle_img, self.method) + if normalize: + result = cv.matchTemplate(haystack_img, needle_img, cv.TM_CCORR_NORMED, None, mask) + _minVal, _maxVal, minLoc, maxLoc = cv.minMaxLoc(result, None) + cv.normalize(result, result, 0, 1, cv.NORM_MINMAX, -1) + else: + result = cv.matchTemplate(haystack_img, needle_img, self.method) # Get the all the positions from the match result that exceed our threshold locations = np.where(result >= threshold) @@ -91,6 +97,15 @@ class Vision: # concatenate together results without causing an error if not locations: return np.array([], dtype=np.int32).reshape(0, 4) + #while len(locations) > 1000: + # threshold = threshold + 0.01 + # locations = np.where(result >= threshold) + # locations = list(zip(*locations[::-1])) + # print("modified treshhold to:" + str(threshold)) + # print("actual locations:" + str(len(locations))) + + if len(locations) > 5000: + return np.array([], dtype=np.int32).reshape(0, 4) # You'll notice a lot of overlapping rectangles get drawn. We can eliminate those redundant # locations by using groupRectangles().