Распознавание изображений PyAutoGUI — небольшая проблема с сопоставлением цветов пикселей

Я пытаюсь остановить возможный блок в моей программе бота, используя функцию распознавания изображений PyAutoGUI (pyautogui.locateCenterOnScreen), чтобы распознать простую кнопку «ОК», чтобы избавиться от возможного сообщения об ошибке блока. Тем не менее, функция работает только иногда, как я выяснил, делая снимки экрана с различными сообщениями об ошибках и сравнивая цвет пикселя рядом. Результат, который я обнаружил, заключается в том, что цвет пикселя на двух разных кнопках «ОК» обычно отключен на 1, что объясняет, что функция распознавания изображений возвращает None большую часть времени. Я хотел бы иметь возможность распознавать изображение, даже если цвет отключен на 1 или 2 пикселя. Я понимаю, что есть ключевой аргумент tolerance, но положение кнопки меняется на экране, что затрудняет использование функции getpixel, и вы не можете использовать tolerance с locateCenterOnScreen (насколько я понимаю). Будут ли какие-либо предложения относительно того, как я могу решить эту проблему? Заранее спасибо.


person D.Vious    schedule 27.04.2017    source источник
comment
Подсказки в моем ответе дают вам решение вашей проблемы? Что-то еще непонятно? Если да, просто спросите, а если нет, примите ответ (нажав на «V», который станет зеленым, если ответ принят).   -  person Claudio    schedule 27.04.2017


Ответы (1)


Попробуйте это ниже (см. здесь: http://pyautogui.readthedocs.io/en/latest/screenshot.html )

введите здесь описание изображения

Из комментария я знаю, что вы пробовали это, и это не решило проблему в вашем случае.

Другая идея, которая может помочь, заключается в том, что вы обрезаете изображение кнопки до абсолютного минимума, необходимого для ее обнаружения на экране. Обычно цвета ближе к центру более «стабильны», чем тени.

Из комментария я знаю, что это также не решило вашу проблему.

Разрешаете ли вы ПРОЗРАЧНОСТЬ для Windows в вашей ОС (прозрачность - это когда вы можете "видеть" через то, что отображает текущее приложение, что находится в фоновом режиме окна этого приложения - это функция, которая является значением по умолчанию во многих версиях новейших операционных систем)?

Из комментария я знаю, что да.

Это может привести к серьезным проблемам с распознаванием. Снижение (до какого уровня?) прозрачности не решило проблему, а значит, единственный правильный путь:

Отключите функцию прозрачности, чтобы получить стабильные цвета

Все - проблема решена (как это сделать для вашей конкретной системы - другой вопрос, не относящийся к теме распознавания изображений).

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

ДОБАВЛЕНИЕ: Форма и цвет кнопки [ОК] могут зависеть от многих факторов. При отображении в интернет-браузере он может изменить свой размер при изменении размера страницы. Если пользовательский диалог создается разными приложениями, форма и цвет кнопки [ОК] также могут различаться, если приложение не использует системные стандарты. И, как сказано выше, цвета могут отличаться, если система использует функцию прозрачности.

person Claudio    schedule 27.04.2017
comment
Привет, я думаю, что обрезка изображения до минимума не сработает, так как изображение, которое я пытаюсь распознать, имеет различия в пикселях, которые даже находятся рядом друг с другом. Я попытался решить свою проблему, уменьшив прозрачность (я использую macOS Sierra), но проблема все еще не устранена. Как вы думаете, это может быть как-то связано с моим профилем дисплея? Спасибо за вашу помощь. - person D.Vious; 28.04.2017
comment
Я также использую grayscale=True в своем коде, но ему все еще не удается распознавать кнопки каждый раз, когда он появляется. - person D.Vious; 28.04.2017
comment
См. обновленный ответ. Я уверен, что это должно решить проблему с изменением цветов. - person Claudio; 28.04.2017
comment
@ D.Vious У меня тоже такая же проблема. Я использую pyautogui.screenshot() для сохранения двух изображений png и сравниваю их по пикселям. Я обнаружил, что некоторые пиксели немного отличаются, например Другое изображение в позиции [316, 904], пиксель 1 [42, 42, 42, 42], пиксель 2 [41, 41, 41, 41]. - person sfz; 18.12.2018