Hello guys just a quick question with regards to CV2 Template matching.
I’m developing a bot program for an old online MMORPG game and as part of the calibration system I have 4 functions with the purpose of finding each cardinal point . All works well , however I want to add a 5th function that gets the current position.
So what it’s supposed to do is simply find the current cardinal point orientation on a compass image by comparing the current position on that image with a list of templates for each cardinal point .
self.all_cardinals = [self.east_img,self.north_img,self.west_img,self.south_img]
def findcurrent(self):
for image in self.all_cardinals:
test_img = pyautogui.screenshot(region=(1249, 102, 22, 22))
test_img2 = cv2.cvtColor(np.array(test_img), cv2.COLOR_RGB2BGR)
result = cv2.matchTemplate(test_img2, image, method=cv2.TM_CCORR_NORMED, mask=image)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
threshold = 0.945
if max_val >= threshold:
break
else:
continue
Compass mage to search over
Template image to search for
Now all this works fine in the sense that if the character in-game is facing any one of the 4 cardinal points it breaks out of the loop, however I am struggling with outputting that result and adding that in a ‘if’ condition statement.
For example if the result was a match for the W cardinal point then do something like another function.
Or if the result was a match for the S cardinal point do something else.
I have been going back and forth with this and tried a few different methods like adding a return image
to the function which gives me back a 3d array and tried to compare that to the original cv2.imread
of that image.
east_img = cv2.imread('resources/findxy/facingeast.png')
east_test = Calibrate.findcurrent()
print(east_img == east_test)
I’m getting a ValueError: operands could not be broadcast together with shapes .
MRE. We have a white background image (bgcolor is irrelevant) with 1 red square on it. . We then template-match 4 different color squares (one being red) by using a for loop and tell it to break when it finds a match . How do we then obtain that output (red match) and use it. e.g if the match was the red square then do something
APizzy is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.