Как найти пиксель на экране python

Обновлено: 06.07.2024

Нужно как можно быстрее получать информацию о цвете пикселя с экрана.
Благодаря каким библиотекам это можно реализовать? Желательно с примером кода. Спасибо.

Пока что пробую pyautogui.pixel() но он слишком медленный вот сам код

Код спамит клавиши D,F,J,K при правильном цвете соответствующих пикселей

Если быть точным, то мне нужно получение цвета 4 пикселей экрана не реже чем 60 раз в секунду (Суммарно в секунду не менее 240 значений)

Отредактировано lllNF (Авг. 10, 2018 12:06:56)

Быстрое получение цвета пикселя с экрана

С чего вы решили что он медленный? Где код по которому вы сделали вывод что он медленный?

ps
Если надо быстро обрабатывать картинку, то практически никогда не работают с отдельными пикселами даже на С не говоря уже о питоне у которого просто циклы в сотни раз медленнее.

Быстрое получение цвета пикселя с экрана

lllNF код в студию потому как даже в pyautogui есть несколько способов получить цвет пиксела.

Быстрое получение цвета пикселя с экрана

Где код по которому вы сделали вывод что он медленный?

Отредактировано lllNF (Авг. 10, 2018 12:09:48)

Быстрое получение цвета пикселя с экрана

lllNF а у вас часом не венда? если венда то таки да он может работать медленно. Начнем с того что что у самого pyautogui нет метода pixel(), оно берет его из pyscreeze

Отредактировано PEHDOM (Авг. 10, 2018 14:26:09)

Быстрое получение цвета пикселя с экрана

PEHDOM
lllNF а у вас часом не венда? если венда то таки да он может работать медленно.

Хорошо буду знать. Но есть ли способ более быстрого получения цвета пикселя для python 3.x?

Быстрое получение цвета пикселя с экрана

lllNF
Но есть ли способ более быстрого получения цвета пикселя для python 3.x?

давайте для начала все же определимся с вашей скоростью, с чего вы взяли что оно работает медленно? Имхо 0,003 секунды вполне достаточно для любого бота, или тогда хотябы выложите сколько у вас занимает времени эта процедура.
PS мда забыл что сам всю эту фигню отключаю, вобщем получение одного пиксела Гетпикселом:
тема Windows Aero с включенной композицией 0.02 сек
тема Windows Aero с выключенной композицией 0.004 сек

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

Отредактировано PEHDOM (Авг. 10, 2018 16:01:06)

Быстрое получение цвета пикселя с экрана

lllNF
. Но есть ли способ более быстрого получения цвета пикселя для python 3.x?


Это неправильный вопрос, все зависит от задачи, если вам нужно таки один пиксел то всежи имхо быстрее чем GetPixel сделать это весьма трудно. Другое дело если нужно найти какойто пиксел на экране или перебрать несколько пикселов, тогда имеет смысл сделать скриншот и уже работать с ним. Например на выполнение PIL.ImageGrab.grab() уходит теже 0.02 секунды, но потом вы уже не теряете время, а просто перебиаете пикселы что вам нужно.
На одном пикселе разницы никакой, но напмриер на 4-х разница уже в 4 раза, так как на PIL.ImageGrab.grab() у вас уйдет 0.2 секунды, а на всю остальную математику десятытысячные доли, в тоже время на каждый GetPixel() у вас будет уходить по 0.02 секунды, а это уже почти 0.1 секунды.
В данном случае, не ГетПиксел медленный, а архитектура неправильная

Отредактировано PEHDOM (Авг. 10, 2018 17:09:27)

Быстрое получение цвета пикселя с экрана

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

0.06 сек, а это много.

Как можно оптимизировать этот код? Я просто в этом деле ещё совсем зеленый

Быстрое получение цвета пикселя с экрана

я бы через ctypes сделал, намного быстрее с однородными массивами работает

Поиск определенного пикселя на экране
Всем привет. Пишу игрового бота. Дано: Есть часть экрана размером в 1080х871 Нужно: Найти в этой.

Цвет определенного пикселя на экране
Как сделать процедуру с помощью которой в текстовом редакторе отображался цвет(в формате.

Узнать цвет определенного пикселя на экране
Привет всем:) столкнулся с проблемой, а проблема состоит в том, что я хочу узнать цвет.

Получение RGB цвета определённого пикселя на экране
Необходимо получить RGB цвет пикселя который находится на кординатах x и y. Как это сделать?

Можно что-то такое сделать

0.041104663999999985 seconds
(array([ 1, 2, 3, 3, 3, 3, 4, 4, 7, 8, 8, 8, 15, 16, 22, 26, 27,
27, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 33, 33, 33, 33, 33, 33,
34, 34, 34, 34, 35, 36, 36, 37, 38, 38, 39, 39, 39, 39, 39, 40, 41,
41, 42, 43, 43, 43, 44, 45, 45, 45, 47, 49, 49, 50, 52, 60, 60, 62,
63, 63, 63, 63, 65, 70, 70, 71, 72, 73], dtype=int64), array([17, 22, 18, 19, 20, 21, 19, 20, 23, 24, 25, 26, 21, 66, 20, 10, 11,
65, 11, 16, 42, 14, 21, 21, 17, 66, 14, 18, 19, 20, 21, 35, 35, 35,
15, 34, 35, 36, 15, 15, 36, 15, 15, 36, 9, 13, 14, 15, 35, 8, 6,
42, 4, 3, 26, 41, 2, 0, 1, 24, 28, 28, 50, 28, 39, 15, 16, 13,
19, 22, 23, 50, 19, 13, 15, 22, 15, 30], dtype=int64), array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 2, 1, 1, 2, 1,
1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 1, 2, 1, 2, 2, 2, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 2, 1, 1,
1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0], dtype=int64))


я так понял код должен был найти координату, RGB которой я ввёл корректно. Вывод слишком много совпадений? Почему он не вывел мне верную координату?

я так понял код должен был найти координату, RGB которой я ввёл корректно.

Он находит все точки с заданным цветом, но 3 раза, так как изображение по умолчанию создается в RGB, в первом массиве все координаты x, во втором все координаты y, в третьем индексы цветов, можете конвертировать изображение, чтобы по одной координате находило

Кот в зелени

Начнем наш поиск семейства кошачьих с такого кадра:

Рыжий кот

Как мы можем видеть, в данном кадре есть большой и очень заметный кот. Мы его видим, но как его может увидеть компьютер? Для него данное изображение лишь массив точек с разными значениями цвета. Смотрим что мы в данный момент имеем:

Разберем данный код:

На выходе мы получаем такое изображение:

Находим кота в BGR

Находим кота в BGR

Куб RGB(BGR)

Схема RGB(BGR)

На данной схеме становится понятно, что пространство между двумя заданными точками цвета также является кубом RGB. Таким образом, наша функция находит вложенный цветовой куб в полном кубе RGB. Кроме того, что это может непонятно звучать, это и работает не самым лучшим образом: представим что мы хотим найти оттенки пурпурного цвета, в таком случае мы размещаем наш вложенный куб как можно ближе к пурпурному. Но при таком размещении, мы так или иначе затрагиваем все остальные цвета, из-за того, что стороны куба параллельны основному. Как в таком случае поступить?

Переход RGB - HSV

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

Конус HSL

В данном конусе диапазон выбранных цветов будет представлять из себя конический слой. Его главные для нас атрибуты: он лежит по оттенку в заданных пределах, в отличии от BGR, его светлота и интенсивность также определяются просто и очевидно в описании цветового предела. Благодаря таким удобным и полезным свойствам данное цветовое пространство заслужило большую любовь как среди дизайнеров, так и особенно среди общества разработчиков компьютерного зрения. В OpenCV3 данное цветовое пространство имеет обозначение HSV. Переведем наше изображение в него и снова найдем котейку:

Тут я лишь остановлюсь на моменте выбора цвета, в данном примере мы руководствовались лишь собственным глазом и оценкой того, какой цвет мы хотим найти. Этим HSV замечательно отличается от RGB, в которой нам необходимо каждый цвет искать в справочнике или использовать сторонние программы. Однако в конечных продуктах следует использовать более умную методику выбора диапазонов, которую я покажу на других фотографиях. В нашем случае получился такой результат:

Кот в HSV

Отметим кота в кадре стандартными средствами OpenCV3

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

Результатом данного кода будет найденный отмеченный большой рыжий кот:

Кот найден

Итог

В этом руководстве мы сосредоточимся только на обнаружении и распознавании объектов изображений в Python с помощью OpenCV. Мы узнаем, как мы можем использовать OpenCV для обнаружения объектов по заданному изображению с помощью программы Python.

Обнаружение объекта

С использованием OpenCV

В этом разделе мы узнаем, как мы можем выполнять обнаружение объектов в изображении или видео с помощью библиотеки OpenCV. Сначала мы импортируем библиотеку OpenCV в программу Python, а затем будем использовать функции для обнаружения объектов в предоставленном нам файле изображения. Но, прежде чем использовать и импортировать библиотечные функции, давайте сначала установим требования для использования техники обнаружения объектов.

В этом уроке мы будем использовать каскадную технику Хаара для обнаружения объектов. Давайте сначала узнаем вкратце о каскадной технике Хаара.

Каскад Хаара

  • Положительные изображения: это изображения, которые содержат объекты, которые мы хотим идентифицировать с помощью классификатора.
  • Отрицательные изображения: это изображения, которые не содержат никаких объектов, которые мы хотим обнаружить классификатором, и это могут быть изображения всего остального.

Требования для обнаружения объектов с помощью Python OpenCV

Мы должны сначала установить некоторые важные библиотеки в нашу систему, поскольку это важное требование для выполнения задач обнаружения объектов. Мы должны установить следующие библиотеки в нашу систему в качестве требования для выполнения обнаружения объектов:

Прежде всего, требование для выполнения обнаружения объектов с использованием библиотеки OpenCV состоит в том, что библиотека OpenCV должна присутствовать на нашем устройстве, чтобы мы могли импортировать ее в программу Python и использовать ее функции обнаружения объектов. Если этой библиотеки нет в нашей системе, мы можем использовать следующую команду в нашем терминале командной строки для ее установки:

Установка библиотеки OpenCV

Когда мы нажимаем клавишу ввода после написания этой команды в терминале, установщик pip в командной строке начнет установку библиотеки OpenCV в нашу систему.

Отображение процесса установки библиотеки OpenCV

Как мы видим, библиотека OpenCV успешно установлена в нашей системе, и теперь мы можем импортировать ее в программу Python, чтобы использовать ее функции.

Matplotlib очень полезна при открытии, закрытии, чтении изображений в программе Python, и поэтому установка этой библиотеки для обнаружения объектов становится важным требованием. Если библиотека matplotlib отсутствует в нашей системе, мы должны использовать следующую команду в нашем терминале командной строки, чтобы установить ее:

Библиотека matplotlib

Когда мы нажимаем клавишу ввода после написания этой команды в терминале, установщик pip в командной строке начнет установку его в нашу систему.

Установка библиотеки matplotlib

Как мы видим, библиотека matplotlib успешно установлена в нашей системе, и теперь мы можем импортировать ее в программу Python, чтобы использовать ее функции для открытия, чтения и т. д. изображений.

Мы установили все необходимые библиотеки для выполнения обнаружения объектов, и теперь мы можем перейти к реализации части этой задачи.

Реализация в Python

В этой части мы напишем программу Python для обнаружения объектов и понимания его реализации. Мы будем использовать следующее изображение в нашей программе Python, чтобы выполнить обнаружение объекта на нем:

Изображение для обнаружения объекта

Открытие изображения

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

Пример 1: Открытие изображения с помощью OpenCV и библиотеки matplotlib в программе Python

Пример 1

Во-первых, мы импортировали библиотеки OpenCV(как cv2) и matplotlib(как plt) в программу, чтобы использовать их функции в коде. После этого мы открыли файл изображения с помощью функции imread() cv2.

Затем мы определили свойства изображения, которое мы открыли в программе, с помощью функций cv2. Затем мы строим подзаголовок изображения, используя функцию subplot() plt и задавая в ней параметры. Наконец, мы использовали функции imshow() и show() модуля plt, чтобы показать изображение на выходе.

Как мы видим на выходе, изображение отображается в результате работы программы, а его границы были нанесены на вспомогательные черты.

Распознавание или обнаружение объекта на изображении

Теперь мы будем использовать функцию detectMultiScale() в программе для обнаружения объекта, присутствующего на изображении. Ниже приведен синтаксис использования в коде функции detectMultiScale():

Мы будем использовать оператор условия с этой функцией в программе, чтобы проверить, обнаружен ли какой-либо объект на изображении или нет, и выделить обнаруженную часть. Давайте разберемся с реализацией обнаружения объектов на изображении на примере программы.

Пример 2: Обнаружение объекта на изображении с помощью метода detectMultiScale()

Пример 2

После открытия изображения мы импортировали в программу XML-файл каскадного классификатора. Затем мы использовали функцию detectMultiScale() с импортированным каскадным файлом, чтобы определить, присутствует ли объект на изображении или нет.

Мы использовали условие if в программе, чтобы проверить, обнаружен ли объект или нет, и если объект обнаружен, мы выделили часть обнаруженного объекта, используя цикл for с функциями cv2. Выделив на изображении часть обнаруженного объекта, мы отобразили обработанное изображение с помощью функций plt show() и imshow().

Как мы видим в выводе, изображение с выделенной частью обнаруженного объекта показывается нам, когда мы запускаем программу.

Читайте также: