Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/198: Рейтинг темы: голосов - 198, средняя оценка - 4.72
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209

Поиск определенного пикселя на экране

25.02.2017, 23:04. Показов 37313. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пишу игрового бота.
Дано: Есть часть экрана размером в 1080х871
Нужно: Найти в этой части экрана пиксель с RGB цветом 231 232 99 и вернуть его координаты(х, у). Возможно таких частей будет 2-3.

Буду благодарен за помощь.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.02.2017, 23:04
Ответы с готовыми решениями:

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

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

Поиск определенного пикселя на экране, или в окне другой программы
Меня интересует какие библиотеки используются для этого, по читать бы и примерчиков б пару. Ну и допустим меня именно интересует. ...

20
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
01.03.2017, 22:00  [ТС]
Попробовал пропарсить циклом цвета пикселей на нужной мне части экрана... Так-то работает, но ждать минут 10-15 на парсинг большей части пикселей на экране...
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.03.2017, 10:11
Dave_, если делать оптимально, то не может там быть 10-15 минут. Что парсите?
0
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
02.03.2017, 17:01  [ТС]
На данный момент все до чего додумался мой не шибко опытный мозг, то это до 2-ух циклов фор

Python
1
2
3
4
5
6
7
8
9
10
def pixels(x, y):
    hdc = win32gui.GetWindowDC(win32gui.GetDesktopWindow())
    c = int(win32gui.GetPixel(hdc, x, y))
    return array('i',[(c & 0xff), ((c >> 8) & 0xff), ((c >> 16) & 0xff)]) 
 
def OnTimeCheck():
    for a in range(870):
        for b in range(1080):
            result = pixels(b, a);
            print(result);
Что нужно: представь себе кусок экрана. Размер этого куска 1080х870. Вся часть этого экрана белая, однако где-то на ней существуют черные точки(она может быть как одна, так и несколько). Необходимо: зная точный RGB цвет белых точек найти их точные координаты на экране. Желательно сделать так, что бы сам цикл проверок проходил за 10- секунд.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.03.2017, 17:29
Dave_, OMG!!! Конечно будет тормозить!
Во-первых, вы в цикле получаете DC. Зачем? Его достаточно получить единожды.
Во-вторых, пиксель вы получаете у него, у контекста. Я не знаю, что там происходит внутри, с winapi плотно не работал, но наверняка внутри там тоже множество всего тормозного и для частых вызовов не предназначенного.

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

Добавлено через 1 минуту
Dave_, да, в третьих.
В возвращаемом значении у вас очень много лишнего. Формируется список и питоновский массив. Избавьтесь от формирования лишних объектов.

Добавлено через 4 минуты
Да, теоретически возможно ещё ускорить, избавившись от питоновских циклов.

Но для этого надо содержимое картинки перевести в числовой массив в памяти, это надо разбираться, как.
0
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
02.03.2017, 17:36  [ТС]
Спасибо за ответ. С ДС разобрался. Перенес взятие hdc = win32gui.GetWindowDC(win32gui.GetDesktop Window()) в начало функции, остальное же беру и проверяю в массиве.
Касательно битмап, то понятия не имею как создать битмап и как работать с ним. Не мог бы ты объяснить?
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
02.03.2017, 18:18
Цитата Сообщение от Dave_ Посмотреть сообщение
win32gui.GetPixel
Никогда не используйте это. Оно в плане скорости работает через какую-то задницу даже в Win7.
Вам надо:
Создать свой HDC и HBITMAP, выбрать второе в первое через SelectObject(), и дальше вроде два варианта будет - гуглите Scan0 и ScanLine.

Добавлено через 2 минуты

Не по теме:

Я никогда не работал с Python, я как бы по Апи. :)
Может вам сделать DLL с такой функцией и просто пользовать из Python?
Он такое может?



Добавлено через 9 минут
Цитата Сообщение от Dave_ Посмотреть сообщение
hdc = win32gui.GetWindowDC(win32gui.GetDesktop Window())
Кстати с этим не согласен. У вас какая ОС? Начиная с Win8 вроде какие-то ограничения добавили, ещё не смотрел эту ОСь.
Но по логике вам надо либо HDC окна (GetDC от HWND), либо HDC экрана (GetDC от 0), зачем тут Desktop?

Добавлено через 1 минуту
ReleaseDC(), DeleteDC() и DeleteObject() не забывайте!
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
02.03.2017, 18:30
Цитата Сообщение от Dave_ Посмотреть сообщение
Касательно битмап, то понятия не имею как создать битмап и как работать с ним. Не мог бы ты объяснить?
Я тоже понятия не имею, но первая же ссылка в гугле по "winapi DC to bitmap" выдала мне код:
C++
1
2
3
4
5
6
7
8
 HDC winDC = GetWindowDC(window);
 HDC memDC = CreateCompatibleDC(winDC);
 BYTE* memory = 0;
 HBITMAP bitmap = CreateDIBSection(winDC, &info, DIB_RGB_COLORS, (void**)&memory, 0, 0);
 SelectObject(memDC, bitmap);
 BitBlt(memDC, 0, 0, bitmap_dx, bitmap_dy, winDC, 0, 0, SRCCOPY);
 DeleteDC(memDC);
 ReleaseDC(window, winDC);
Источник https://www.gamedev.net/topic/... -a-bitmap/
Там в верхней половинке кода - сохранение в файл, это вам не нужно.
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
02.03.2017, 18:30
А вообще зачем юзать API если можно просто сделать скрин с помощью pillow и потом искать с помощью numpy нужные данные в массиве.
1
3 / 6 / 4
Регистрация: 01.08.2015
Сообщений: 8
03.03.2017, 15:05
Python
1
2
3
4
5
6
7
8
9
10
import sys
import PySide.QtGui as QtGui
 
HEX_COLOR = "0xffcdd0d8L"
 
app = QtGui.QApplication(sys.argv)
desctop = QtGui.QApplication.desktop()
img = QtGui.QPixmap.grabWindow(desctop.winId()).toImage()
 
print tuple( (x, y) for x in xrange(desctop.width()) for y in xrange(desctop.height()) if hex(img.pixel(x, y)) == HEX_COLOR )
0
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
03.03.2017, 23:23  [ТС]
Rodegast, Не могу установить PySide из-за того, что у меня 9-я версия питона.
alex925, Попробовал:
Python
1
2
3
4
5
image = PIL.ImageGrab.grab(bbox=None);
    arr = np.asarray(image);
    count = np.count_nonzero(arr);
    for b in range(count):
        print(arr[b]);
Проблема в том, что каждый раз размер массива возвращается разный.
Code
1
2
3
4
3808462
3800826
3805894
3796368
Да и скорость опять хромает... Может делаю что не так?
dondublon, к сожалению это С++, а не питон
0
9 / 9 / 3
Регистрация: 24.01.2015
Сообщений: 79
Записей в блоге: 6
04.03.2017, 23:12
Может помочь тема:

Поиск фрагмента в изображении

Ниже код, выполняющий захват экрана и поиск предварительно записанной части изображения.


Python
1
2
3
4
5
6
7
8
import autopy
 
zamok  =autopy.bitmap.Bitmap.open("D:/zamok.bmp")
 
rect_vert=(0,0),(100,720)
 
zast=autopy.bitmap.capture_screen(rect_vert)
pos_zamok_sl = zast.find_bitmap(zamok,0.001)
"0.001" - точность сравнения
__
Из проблем:
Левый угол поиска, только нули.
В строке поиск находит координату и переходит на следующую строку.
В играх из интернета изображения могут приходить все время разные и сравнение трудно настроить.
С увеличением области поиска, увеличивается время поиска, но весь захват и поиск - это доли секунды.
0
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
05.03.2017, 13:13  [ТС]
Лысанов Виталий, нету ли какого-то заменителя для autopy? Дело в том, что у меня питон 3.5, а autopy на гораздо ранние версии.

Добавлено через 4 минуты
Заглянул в тему, которые ты мне дал ссылку. Ничего не подошло из тамошнего. Сделал два скрина(один то что нужно натйи, второй скрин всего экрана). Во всех способах возвращало фолс(т.е нету).
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
05.03.2017, 16:03
Вам писали:
Цитата Сообщение от alex925 Посмотреть сообщение
можно просто сделать скрин с помощью pillow и потом искать с помощью numpy нужные данные в массиве
Вы пробовали сиё? Если есть встроенные средства лучше брать их, а не WinAPI.
Из #11 это оно? Может мне не стоит лезть в незнакомую область, но сильно смущает "nonzero" - в цвете более чем может быть "zero".
0
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
05.03.2017, 17:26  [ТС]
GoodWeather, искал я по гуглу литературу и нашел только поиск через nonzero. Самому не нравится, но это в итоге не играет сути т.к цикл выполняется больше 10 секунд - гораздо больше 10 секунд. Вот еще одна версия пиллоу и нампи, на этот раз без такого поиска:
Python
1
2
3
4
5
img = PIL.ImageGrab.grab(bbox=None);
    arr = numpy.array(img);
    for y in range(1024): # высота экрана
        for x in range(1280): # ширина экрана
            print(arr[x,y]);
Выполняется это долго, так что... Проблема пожалуй не в винапи, а в цикле. Скрин экрана делается за доли секунды, а значит именно цикл тормозит скрипт.
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
05.03.2017, 19:00
гм... Виснуть тут может например этот вот "print", что он делает?
А если вместо него просто посчитать сколько на картинке например пикселей #FFFFFF?

Добавлено через 2 минуты
Я могу сделать на WinAPI.
Вы сможете переписать на Питон? Или подключить к нему скомпилированную DLL с функцией?
Какой функционал требуется?: Найти в скриншоте заданную мини-картинку 1:1 и выдать координаты угла прямоугольника? А как хранится искомое?
0
30 / 26 / 9
Регистрация: 06.03.2015
Сообщений: 209
05.03.2017, 21:52  [ТС]
GoodWeather, тут еще новая проблема нарисовалась... В коде, который я бросал в предведущем посте обнаружился баг
Code
1
2
3
4
5
6
Traceback (most recent call last):
  File "D:\Python\Scripts\Sys.py", line 214, in <module>
    OnTimeCheck();
  File "D:\Python\Scripts\Sys.py", line 47, in OnTimeCheck
    if arr[x,y][0] == 129:
IndexError: index 1024 is out of bounds for axis 0 with size 1024
И да, без принта заметно уменьшилось время.

Добавлено через 24 минуты
Непонятно почему появляется эта ошибка. Попробовал вывести инфу о скрине экрана:
Code
1
<PIL.Image.Image image mode=RGB size=1280x1024 at 0x2401F90>
Т.е в 1024 и дальше есть, а точнее должны быть пиксели и соответствнно инфа о них в массиве
0
 Аватар для GoodWeather
886 / 588 / 179
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
05.03.2017, 23:28
гм... Не знаю как в Питонах, а у нас в примитивных языках индексация начинается с нуля. То есть при ширине 1280 диапазон [0..1279].

Добавлено через 1 минуту
Просто действие происходит 1280 x 1024 = 1310720 раз, если это конвертация числа в текст плюс отправка на какой-то некий вывод...
0
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
05.03.2017, 23:30
Цитата Сообщение от GoodWeather Посмотреть сообщение
Не знаю как в Питонах,
Аналогично, так практически везде. Языки где нумерация с 1, это исключение.
0
9 / 9 / 3
Регистрация: 24.01.2015
Сообщений: 79
Записей в блоге: 6
06.03.2017, 01:21
Пример кода с матричным оператором сравнения:

Python
1
2
3
4
5
6
7
8
9
10
11
12
import PIL
import numpy as np
from PIL import ImageGrab
 
 
 
img = PIL.ImageGrab.grab(bbox=None);
arr = np.array(img);
c=np.argwhere(arr[0:3,0:5]==[  1,   0,  17])
print arr[0:3,0:5]
print "______"
print c

Вывод программы:

[[[ 2 1 19]
[ 1 0 17]
[ 2 1 19]
[ 2 1 19]
[ 0 0 20]]

[[ 3 2 20]
[ 1 0 18]
[ 1 0 18]
[ 0 0 18]
[ 0 0 20]]

[[ 3 1 19]
[ 1 0 18]
[ 0 0 18]
[ 0 0 18]
[ 0 1 21]]]
______
[[0 1 0]
[0 1 1]
[0 1 2]

[0 4 1]
[1 1 0]
[1 1 1]
[1 2 0]
[1 2 1]
[1 3 1]
[1 4 1]
[2 1 0]
[2 1 1]
[2 2 1]
[2 3 1]]
>>>

Ответ, это координата 0,1. Только на этой координате в третьей колонке цифры 0,1,2 и только эти координаты встречаются в выводе три раза и матричные операторы работают намного быстрее циклов.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.03.2017, 01:21
Помогаю со студенческими работами здесь

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

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

Поиск пикселя и поиск изображения на экране
Переписываю код из clickermann для запуска его на C++. Мне нужны две функции которые выполняли бы сканирование экрана и поиск пикселя...

Поиск координат пикселя определенного цвета
Здравствуйте, уважаемые участники форума! Я только начинаю программировать на С++ Builder. У меня вот такая вот проблема. Программа рисует...

Быстрый поиск цвета пикселя на экране монитора
Подскажите как можно реализовать быстрый поиск определеного пикселя на экране. Накидал работоспособный код, но он очень долго ищет в цикле....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK сделайте это, JDK, то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Перейдите по ссылке:. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru