mirror of
https://github.com/fishyboteso/fishyboteso.git
synced 2024-08-30 18:32:13 +00:00
full auto: ocr, callibration, get coods done
This commit is contained in:
parent
49cc7f191d
commit
648f3a8a32
@ -1,15 +1,69 @@
|
||||
import math
|
||||
import cv2
|
||||
import logging
|
||||
import time
|
||||
|
||||
import numpy as np
|
||||
import pywintypes
|
||||
import pytesseract
|
||||
|
||||
from fishy.engine.IEngine import IEngine
|
||||
from fishy.engine.window import Window
|
||||
from pynput import keyboard, mouse
|
||||
from pynput.keyboard import Key
|
||||
|
||||
mse = mouse.Controller()
|
||||
kb = keyboard.Controller()
|
||||
|
||||
|
||||
def get_crop_coods(window):
|
||||
Window.loop()
|
||||
img = window.get_capture()
|
||||
img = cv2.inRange(img, 0, 1)
|
||||
Window.loop_end()
|
||||
|
||||
cnt, h = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||
|
||||
"""
|
||||
code from https://stackoverflow.com/a/45770227/4512396
|
||||
"""
|
||||
for i in range(len(cnt)):
|
||||
area = cv2.contourArea(cnt[i])
|
||||
if 5000 < area < 100000:
|
||||
mask = np.zeros_like(img)
|
||||
cv2.drawContours(mask, cnt, i, 255, -1)
|
||||
x, y, w, h = cv2.boundingRect(cnt[i])
|
||||
return x, y, x + w, y + h
|
||||
|
||||
|
||||
def image_pre_process(img):
|
||||
scale_percent = 200 # percent of original size
|
||||
width = int(img.shape[1] * scale_percent / 100)
|
||||
height = int(img.shape[0] * scale_percent / 100)
|
||||
dim = (width, height)
|
||||
img = cv2.resize(img, dim, interpolation=cv2.INTER_AREA)
|
||||
img = cv2.bitwise_not(img)
|
||||
return img
|
||||
|
||||
|
||||
def get_values_from_image(img):
|
||||
try:
|
||||
pytesseract.pytesseract.tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe'
|
||||
tessdata_dir_config = '--tessdata-dir "C:/Program Files (x86)/Tesseract-OCR/" -c tessedit_char_whitelist=0123456789.'
|
||||
|
||||
text = pytesseract.image_to_string(img, lang="eng", config=tessdata_dir_config)
|
||||
vals = text.split(":")
|
||||
return float(vals[0]), float(vals[1]), float(vals[2])
|
||||
except:
|
||||
logging.error("Couldn't read coods")
|
||||
return None
|
||||
|
||||
|
||||
class FullAuto(IEngine):
|
||||
def __init__(self, config, gui_ref):
|
||||
super().__init__(config, gui_ref)
|
||||
self.factors = None
|
||||
|
||||
def run(self):
|
||||
|
||||
try:
|
||||
@ -20,36 +74,74 @@ class FullAuto(IEngine):
|
||||
return
|
||||
|
||||
self.window = Window(color=cv2.COLOR_RGB2GRAY)
|
||||
self.window.crop = get_crop_coods(self.window)
|
||||
|
||||
time.sleep(2)
|
||||
|
||||
if self.get_gui is not None:
|
||||
self.gui.bot_started(True)
|
||||
while self.start:
|
||||
Window.loop()
|
||||
|
||||
img = self.window.get_capture()
|
||||
img = cv2.inRange(img, 0, 1)
|
||||
cnt, h = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||
|
||||
"""
|
||||
code from https://stackoverflow.com/a/45770227/4512396
|
||||
"""
|
||||
crop = self.window.get_capture()
|
||||
for i in range(len(cnt)):
|
||||
area = cv2.contourArea(cnt[i])
|
||||
if 5000 < area < 100000:
|
||||
mask = np.zeros_like(img)
|
||||
cv2.drawContours(mask, cnt, i, 255, -1)
|
||||
x, y, w, h = cv2.boundingRect(cnt[i])
|
||||
crop = self.window.get_capture()[y:h + y, x:w + x]
|
||||
|
||||
# cnt, h = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
|
||||
# print(cnt)
|
||||
|
||||
self.window.show("test", ready_img=crop)
|
||||
self.window.show("test", func=image_pre_process)
|
||||
Window.loop_end()
|
||||
self.gui.bot_started(False)
|
||||
|
||||
def get_coods(self):
|
||||
return get_values_from_image(self.window.processed_image(func=image_pre_process))
|
||||
|
||||
def callibrate(self):
|
||||
logging.debug("Callibrating...")
|
||||
walking_time = 3
|
||||
rotate_by = 100
|
||||
|
||||
coods = self.get_coods()
|
||||
if coods is None:
|
||||
return
|
||||
|
||||
x1, y1, rot1 = coods
|
||||
|
||||
kb.press('w')
|
||||
time.sleep(walking_time)
|
||||
kb.release('w')
|
||||
time.sleep(0.5)
|
||||
|
||||
coods = self.get_coods()
|
||||
if coods is None:
|
||||
return
|
||||
x2, y2, rot2 = coods
|
||||
|
||||
mse.move(rotate_by, 0)
|
||||
time.sleep(0.5)
|
||||
|
||||
coods = self.get_coods()
|
||||
if coods is None:
|
||||
return
|
||||
x3, y3, rot3 = coods
|
||||
|
||||
if rot3 > rot2:
|
||||
rot3 -= 360
|
||||
|
||||
rot_factor = (rot3 - rot2) / rotate_by
|
||||
move_factor = math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) / walking_time
|
||||
self.factors = move_factor, rot_factor
|
||||
logging.info(self.factors)
|
||||
|
||||
def on_press(self, key):
|
||||
if key == Key.down:
|
||||
bot.start = False
|
||||
quit()
|
||||
elif key == Key.left:
|
||||
logging.info(self.get_coods())
|
||||
elif key == Key.up:
|
||||
self.callibrate()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
logging.getLogger("").setLevel(logging.DEBUG)
|
||||
bot = FullAuto(None, None)
|
||||
bot.toggle_start()
|
||||
with keyboard.Listener(
|
||||
on_press=bot.on_press,
|
||||
) as listener:
|
||||
listener.join()
|
||||
|
Loading…
Reference in New Issue
Block a user