diff --git a/tests/assets/FishIconScreen.png b/assets/FishTest3.png similarity index 50% rename from tests/assets/FishIconScreen.png rename to assets/FishTest3.png index fe1af3f..e63c9c8 100644 Binary files a/tests/assets/FishIconScreen.png and b/assets/FishTest3.png differ diff --git a/assets/fishing/Bobber.png b/assets/fishing/Bobber.png new file mode 100644 index 0000000..9bbe4b4 Binary files /dev/null and b/assets/fishing/Bobber.png differ diff --git a/bots/fishing/FishingAgent.py b/bots/fishing/FishingAgent.py index 93a7017..d4786fb 100644 --- a/bots/fishing/FishingAgent.py +++ b/bots/fishing/FishingAgent.py @@ -6,29 +6,19 @@ import time import cv2 as cv import numpy as np import pyautogui +from core.Logger import Logger class FishingAgent: - def __init__(self, mainAgent) -> None: - self.mainAgent = mainAgent - - # interpolate here_path to get the path to the fishing target image + def __init__(self, monitor) -> None: + self.logger = Logger("Fishing Agent") + self.monitor = monitor assetPath = os.path.join( os.path.dirname(os.path.realpath(__file__)), - "assets" + "..\\..\\assets" ) - assetPath = os.path.dirname(os.path.realpath(__file__)) - print(assetPath) - self.fishingBobber = cv.imread( - os.path.join( - assetPath, - "assets", "Bobber.png" - ) - ) + self.fishingBobberImg = cv.imread(os.path.join(assetPath,"fishing","Bobber.png"), cv.IMREAD_GRAYSCALE) self.fishingThread = None - def agentLog(self, log: str): - print("Fishing Agent: " + log) - def castLure(self): self.agentLog("Casting Lure.") # pyautogui.press('1') @@ -59,11 +49,17 @@ class FishingAgent: def pullLine(self): self.agentLog("Pulling line!") + def test(self): + while True: + time.sleep(1) + self.logger.log("###") + self.monitor.findMatch(self.fishingBobberImg) + def run(self): - if self.mainAgent.currImg is None: - print("Image capture not found! Did you start the screen capture thread?") + if self.monitor.screenshot is None: + self.logger.log("Screenshot capture not found...") return - print("Starting fishing thread in 10 seconds...") + self.logger.log("Starting fishing thread in 3 seconds...") time.sleep(3) # print("Switching to fishing hotbar (hotbar 4)") diff --git a/bots/fishing/assets/Bobber.png b/bots/fishing/assets/Bobber.png deleted file mode 100644 index 07f0568..0000000 Binary files a/bots/fishing/assets/Bobber.png and /dev/null differ diff --git a/bots/fishing/assets/FishIcon.png b/bots/fishing/assets/FishIcon.png deleted file mode 100644 index 832155b..0000000 Binary files a/bots/fishing/assets/FishIcon.png and /dev/null differ diff --git a/bots/fishing/assets/Test3.png b/bots/fishing/assets/Test3.png deleted file mode 100644 index 89e02b8..0000000 Binary files a/bots/fishing/assets/Test3.png and /dev/null differ diff --git a/bots/fishing/assets/pecheTest2.png b/bots/fishing/assets/pecheTest2.png deleted file mode 100644 index 30b5dee..0000000 Binary files a/bots/fishing/assets/pecheTest2.png and /dev/null differ diff --git a/bots/fishing/assets/test.png b/bots/fishing/assets/test.png deleted file mode 100644 index f947c6f..0000000 Binary files a/bots/fishing/assets/test.png and /dev/null differ diff --git a/core/Logger.py b/core/Logger.py new file mode 100644 index 0000000..4838daf --- /dev/null +++ b/core/Logger.py @@ -0,0 +1,9 @@ +import datetime; + +class Logger: + def __init__(self, name = "Logger") -> None: + self.name = name + + def log(self, message): + ct = datetime.datetime.now() + print(ct.strftime("%m/%d/%Y-%H:%M:%S:"), self.name, ">>", message) \ No newline at end of file diff --git a/core/MainAgent.py b/core/MainAgent.py index 7d25ddd..57c7a37 100644 --- a/core/MainAgent.py +++ b/core/MainAgent.py @@ -1,18 +1,13 @@ -from threading import Thread from core.Monitor import Monitor +from bots.fishing.FishingAgent import FishingAgent class MainAgent: def __init__(self) -> None: self.monitor = Monitor() - self.screenThread = None + self.fishingBot = FishingAgent(self.monitor) - def startScreenCaptureThread(self): - self.screenThread = Thread(target=self.monitor.updateScreen, args=(self,), name="Update screen thread", daemon=True) - self.screenThread.start() - print("Main Agent: Thread started") + def startFishBot(self): + self.monitor.startScreenCaptureThread() + self.fishingBot.test() - def stopScreenCaptureThread(self): - if (self.screenThread): - self.screenThread.terminate() - print("Main Agent: Thread terminated") diff --git a/core/Monitor.py b/core/Monitor.py index 0c9a66c..814d51f 100644 --- a/core/Monitor.py +++ b/core/Monitor.py @@ -1,15 +1,22 @@ import time +import os +from threading import Thread +from screeninfo import get_monitors import pyautogui import numpy as np import cv2 as cv -from screeninfo import get_monitors +from matplotlib import pyplot as plt +from core.Logger import Logger FPS_REPORT_DELAY = 3 class Monitor: def __init__(self): + self.logger = Logger("Monitor") self.monitor = None + self.screenThread = None self.screenshot = None + self.fps = None self.getMonitor() def getMonitor(self): @@ -18,8 +25,8 @@ class Monitor: self.monitor = monitor def updateScreen(self): - print("Starting computer vision screen update...") - print("Detected display resolution: " + str(self.monitor.width) + " x " + str(self.monitor.height)) + self.logger.log("Monitor: Starting computer vision screen update...") + self.logger.log("Monitor: Detected display resolution: " + str(self.monitor.width) + " x " + str(self.monitor.height)) loopTime = time.time() fpsPrintTime = time.time() @@ -32,8 +39,50 @@ class Monitor: currTime = time.time() if currTime - fpsPrintTime >= FPS_REPORT_DELAY: - print('FPS: {}'.format(1 / (currTime - loopTime))) + self.fps = 1 / (currTime - loopTime) fpsPrintTime = currTime loopTime = currTime + + def startScreenCaptureThread(self): + self.screenThread = Thread(target=self.updateScreen, name="Update screen thread", daemon=True) + self.screenThread.start() + self.logger.log("Main Agent: Thread started") + + def findMatch(self, img, method = "TM_CCOEFF_NORMED"): + methodInt = getattr(cv, method) + + herePath = os.path.dirname(os.path.realpath(__file__)) + template = cv.imread(os.path.join(herePath, "assets", "FishTest3.png"), cv.IMREAD_GRAYSCALE) + + res = cv.matchTemplate(img, template, methodInt) + w, h = template.shape[::-1] + min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res) + + # If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum + if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]: + top_left = min_loc + else: + top_left = max_loc + bottom_right = (top_left[0] + w, top_left[1] + h) + + cv.rectangle(img,top_left, bottom_right, 255, 2) + + plt.subplot(121) + plt.imshow(res,cmap = 'gray') + plt.title('Matching Result') + plt.xticks([]) + plt.yticks([]) + plt.subplot(122) + plt.imshow(img,cmap = 'gray') + plt.title('Detected Point') + plt.xticks([]) + plt.yticks([]) + plt.suptitle(method) + plt.show() + + def stopScreenCaptureThread(self): + if (self.screenThread): + self.screenThread.terminate() + self.logger.log("Main Agent: Thread terminated") \ No newline at end of file diff --git a/bots/fishing/assets/FishIconScreen.png b/core/assets/FishTest3.png similarity index 50% rename from bots/fishing/assets/FishIconScreen.png rename to core/assets/FishTest3.png index fe1af3f..e63c9c8 100644 Binary files a/bots/fishing/assets/FishIconScreen.png and b/core/assets/FishTest3.png differ diff --git a/core/cli/CliAgent.py b/core/cli/CliAgent.py index a91e5f3..763a492 100644 --- a/core/cli/CliAgent.py +++ b/core/cli/CliAgent.py @@ -1,10 +1,12 @@ import cv2 as cv +from core.Logger import Logger class CLIAgent: def __init__(self, mainAgent) -> None: self.isRunning = False + self.logger = Logger("CliAgent") if (not mainAgent): - raise Exception("CLI: Main agent not found...") + raise Exception("Main agent not found...") self.mainAgent = mainAgent def printMenu(self): @@ -18,26 +20,20 @@ class CLIAgent: self.isRunning = True self.printMenu() - while self.isRunning: + while self.isRunning is True: userInput = input() userInput = str.lower(userInput).strip() if (userInput == "f"): - print("Starting Fishing bot...") - self.mainAgent.startScreenCaptureThread() - break - # fishingAgent = FishingAgent(mainAgent) - # fishingAgent.run() + self.logger.log("Starting Fishing bot...") + self.mainAgent.startFishBot() elif (userInput == "h"): self.printMenu() - break elif (userInput == "q"): cv.destroyAllWindows() - print("Exiting application...") + self.logger.log("Exiting application...") self.isRunning = False - break else: - print("Unknown Command.") + self.logger.log("Unknown Command.") self.printMenu() - break diff --git a/in_memory_to_disk.png b/in_memory_to_disk.png index eb94cab..5cb85a3 100644 Binary files a/in_memory_to_disk.png and b/in_memory_to_disk.png differ