safsr sdfdsfff
Ученик
(189)
1 неделю назад
Ваша программа для поиска целей по цвету и управления мышью выглядит вполне убедительно, однако я замечаю несколько возможных ошибок и улучшений.
Первоначально, ваше определение «mask» в функции find_targets для красного цвета неправильно обрабатывает оба диапазона: сначала создается маска для первого диапазона, но затем, если текущий цвет также красный, создается вторая маска. Я рекомендую использовать cv2.add вместо cv2.bitwise_or для сочетания двух масок.
Также вы можете столкнуться с проблемой, если количество контуров в contours будет равно нулю в функции find_targets. Это может вызвать ошибку, если вы попытаетесь обратиться к элементам ally_positions без проверки его длины.
Наконец, в функции follow_ally стоит добавить задержку после движения, чтобы обеспечить более плавное движение. При текущем подходе могут быть непредсказуемые результаты, если последовательно вызывать keyDown и keyUp.
В дальнейшем вам стоит рассмотреть использование исключений для улавливания и обработки возможных ошибок.
import numpy as np
import pyautogui
import time
import mss
# Параметры для цвета
GREEN_LOWER = np.array([40, 100, 100]) # Нижний предел для зеленого цвета в HSV
GREEN_UPPER = np.array([80, 255, 255]) # Верхний предел для зеленого цвета в HSV
RED_LOWER = np.array([0, 100, 100]) # Нижний предел для красного цвета в HSV
RED_UPPER = np.array([10, 255, 255]) # Верхний предел для красного цвета в HSV
RED_LOWER2 = np.array([160, 100, 100]) # Нижний предел для второго диапазона красного цвета
RED_UPPER2 = np.array([180, 255, 255]) # Верхний предел для второго диапазона красного цвета
# Функция для захвата экрана и поиска целей по цвету
def find_targets(color_lower, color_upper):
# Захват экрана
with mss.mss() as sct:
screenshot = sct.grab(sct.monitors[1])
img = np.array(screenshot)
# Преобразование в формат BGR
img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
# Преобразование в цветовое пространство HSV
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# Создание маски для определенного цвета
mask = cv2.inRange(hsv, color_lower, color_upper)
# Для красного цвета используем два диапазона
if (np.array_equal(color_lower, RED_LOWER) or np.array_equal(color_lower, RED_LOWER2)):
mask2 = cv2.inRange(hsv, RED_LOWER2, RED_UPPER2)
mask = cv2.bitwise_or(mask, mask2)
# Нахождение контуров
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
targets = []
for contour in contours:
if cv2.contourArea(contour) > 500: # Игнорируем маленькие контуры
M = cv2.moments(contour)
if M["m00"] != 0:
cX = int(M["m10"] / M["m00"])
cY = int(M["m01"] / M["m00"])
targets.append((cX, cY)) # Центр контура
return targets