python — как распознавать изображения и нажимать на них

#python #pyautogui

#python #pyautogui

Вопрос:

Я хотел бы создать скрипт, который нажимает на изображения в зависимости от того, что запрашивается, он должен проходить через список изображений. так, например, если программа попросит пользователя щелкнуть по зеленому кружку:

 question_list = greencircle, redcircle, bluesquare, redtriangle

if(greencircle == greencircle.png){
    pyautogui.click(greencircle.png)
}
  

может кто-нибудь помочь с этим?

Комментарии:

1. Если вам нужно распознавание изображений, вы должны использовать OpenCV для распознавания изображений на экране и pyautogui для щелчка по ним после получения их координат.

2. Способ задать свой первый вопрос! Добро пожаловать!! Основываясь на документации, похоже, что pyautogui.click() — правильный синтаксис. Можете ли вы уточнить, какую проблему вы видите? pyautogui.readthedocs.io/en/latest

3. @StephenGodderidgeThanks спасибо! Итак, в основном у меня есть приложение для моего школьного проекта, и у меня есть программа, которая просит пользователя щелкнуть по чему-то, в основном как изображение из reCAPTCHA. Моя программа просто не работает, и я не знаю почему

4. Итак, программа должна знать, что представляет собой каждое изображение, верно? Таким образом, он может выбирать, какое изображение щелкнуть? Если это так, я бы пошел с тем, что предложил @Nastor. Проверьте OpenCV для распознавания изображений. Вот удобный учебник, с которого вы могли бы начать: learnopencv.com/image-recognition-and-object-detection-part1

5. Разве opencv не принимает только камеру? Мне нужно сделать снимок на экране, чтобы камера не разрешалась

Ответ №1:

PyAutoGUI имеет встроенную вызываемую функцию locateOnScreen() , которая возвращает координаты x, y центра изображения, если она может найти его на текущем экране (он делает снимок экрана, а затем анализирует его).

Изображение должно точно совпадать, чтобы это работало; т. Е. Если вы хотите нажать на button.png эту кнопку, изображение должно быть того же размера / разрешения, что и кнопка в вашей Windows, чтобы программа ее распознала. Один из способов добиться этого — сделать снимок экрана, открыть его в paint и вырезать только ту кнопку, которую вы хотите нажать (или вы можете попросить PyAutoGUI сделать это за вас, как я покажу в более позднем примере).

 import pyautogui

question_list = ['greencircle', 'redcircle', 'bluesquare', 'redtriangle']

user_input = input('Where should I click? ')

while user_input not in question_list:
    print('Incorrect input, available options: greencircle, redcircle, bluesquare, redtriangle')
    user_input = input('Where should I click?')

location = pyautogui.locateOnScreen(user_input   '.png')
pyautogui.click(location)
  

Приведенный выше пример требует, чтобы у вас уже был greencircle.png и все другие .png в вашем каталоге

PyAutoGUI также может делать снимки экрана, и вы можете указать, в какой области экрана делать снимок pyautogui.screenshot(region=(0, 0, 0, 0)) . Первые два значения — это координаты x, y для верхнего левого края области, которую вы хотите выбрать, третье — как далеко вправо (x), а четвертое — как далеко вниз (y).

В следующем примере делается снимок экрана с логотипом Windows 10, сохраняется в файл, а затем нажимается на логотип с помощью указанного файла .png

 import pyautogui

pyautogui.screenshot('win10_logo.png', region=(0, 1041, 50, 39))
location = pyautogui.locateOnScreen('win10_logo.png')
pyautogui.click(location)
  

Вам также не нужно сохранять снимок экрана в файл, вы можете просто сохранить его как переменную

 import pyautogui

win10 = pyautogui.screenshot(region=(0, 1041, 50, 39))
location = pyautogui.locateOnScreen(win10)
pyautogui.click(location)
  

Для того, чтобы программа определяла, нажал ли пользователь в определенной области (скажем, на логотип Windows 10), потребуется другая библиотека, такая как pynput.

 from pynput.mouse import Listener    

def on_click(x, y, button, pressed):
    if 0 < x < 50 and 1080 > y > 1041 and str(button) == 'Button.left' and pressed:
        print('You clicked on Windows 10 Logo')
        return False    # get rid of return statement if you want a continuous loop

with Listener(on_click=on_click) as listener:
    listener.join()
  

СОБИРАЕМ ВСЕ ЭТО ВМЕСТЕ

 import pyautogui
from pynput.mouse import Listener

win10 = pyautogui.screenshot(region=(0, 1041, 50, 39))
location = pyautogui.locateOnScreen(win10)

# location[0] is the top left x coord
# location[1] is the top left y coord
# location[2] is the distance from left x coord to right x coord
# location[3] is the distance from top y coord to bottom y coord

x_boundary_left = location[0]
y_boundary_top = location[1]
x_boundary_right = location[0]   location[2]
y_boundary_bottom = location[1]   location[3]


def on_click(x, y, button, pressed):
    if x_boundary_left < x < x_boundary_right and y_boundary_bottom > y > y_boundary_top and str(button) == 'Button.left' and pressed:
        print('You clicked on Windows 10 Logo')
        return False    # get rid of return statement if you want a continuous loop


with Listener(on_click=on_click) as listener:
    listener.join()