Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
Nalik
131 / 83 / 40
Регистрация: 30.11.2012
Сообщений: 973
1

Как сделать проверку по диапазону цвета пикселя?

07.05.2014, 12:25. Просмотров 988. Ответов 12
Метки нет (Все метки)

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

Если бы пиксель в координатах был бы неизменным, реализовалось бы это так:

C++
1
2
3
4
5
6
7
8
9
10
11
HDC hdc=GetDC(Handle);
COLORREF  d = GetPixel (hdc, 393, 63); // координаты определения пикселя
ReleaseDC(Handle,hdc);
if (Handle, d ==RGB(134,29,29)) //RGB коды цветов 
{
    cout << "цвет совпадает";
}
else
{
    cout << "цвет не совпадает";
}
Но так как цвет постоянно меняется, из за этого мигания.. то мне нужно задать диапазон RGB цветов..подскажите пожалуйста как сделать..
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2014, 12:25
Ответы с готовыми решениями:

Используя условный оператор if или switch, выполните проверку на принадлежность значения переменной диапазону [10; 20)
Используя условный оператор if или switch, выполните проверку на принадлежность значения переменной...

Как сделать проверку цвета в ABC?
Ситуация такая: необходимо узнать цвет пиксела с координатами (X,Y) и в зависимости от него...

Как сделать проверку цвета области вокруг указанной координаты?
Разработать приложение для формирования на экране динамической заставки. В квадрат вписывается 5 –...

Не знаю как сделать "проверку цвета"
Есть матрица 10х10 заполненная квадратиками разукрашенная различными цветами. #!/usr/bin/env...

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

12
newbie666
Заблокирован
07.05.2014, 12:29 2
Цитата Сообщение от Nalik Посмотреть сообщение
то мне нужно задать диапазон RGB цветов
ну вот ты сначала определись с этим диапазоном, а потом каждую составляющую пикселя сверяй с диапазоном, ну типа если текущая RED составляющая цвета >= min диапазона и <= max диапазона RED, то проверяй следующую, если все в диапазоне - всё ок
0
stima
496 / 346 / 93
Регистрация: 22.03.2011
Сообщений: 1,107
Завершенные тесты: 2
07.05.2014, 12:39 3
А зачем Вам "operator ,"?
0
Kuzia domovenok
2832 / 2419 / 619
Регистрация: 25.03.2012
Сообщений: 8,621
Записей в блоге: 1
Завершенные тесты: 1
07.05.2014, 12:42 4
Задача стрёмно сформулирована.Такое чувство, что ты экран чужого приложения читаеш, хакер, блин...
Даже если так, ты должен чётко сказать, что ты хочешь распознать на экране.
Отталкиваться надо не только от цвета твоего пикселя, но и от цветов соседних.
Расчитывать, например контрастность этого пикселя на фоне остальных...
0
07.05.2014, 12:42
Nalik
131 / 83 / 40
Регистрация: 30.11.2012
Сообщений: 973
07.05.2014, 12:53  [ТС] 5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Задача стрёмно сформулирована.Такое чувство, что ты экран чужого приложения читаеш, хакер, блин...
Даже если так, ты должен чётко сказать, что ты хочешь распознать на экране.
Отталкиваться надо не только от цвета твоего пикселя, но и от цветов соседних.
Расчитывать, например контрастность этого пикселя на фоне остальных...
не трудно догадаться, по Handle))

Цитата Сообщение от newbie666 Посмотреть сообщение
ну вот ты сначала определись с этим диапазоном, а потом каждую составляющую пикселя сверяй с диапазоном, ну типа если текущая RED составляющая цвета >= min диапазона и <= max диапазона RED, то проверяй следующую, если все в диапазоне - всё ок
ок, спасибо)

Я так понял, можно сделать максимальный предел диапазона и минимальный, потом получать цвет с координат и если этот цвет попадает в диапазон, то всё ок.
Только для этого RGB нужно разбить на отдельные составляющие и занести их в переменные, но вот как это сделать?

Что-то типо того?
R = a;
G = b;
B = c;
0
newbie666
Заблокирован
07.05.2014, 13:37 6
Лучший ответ Сообщение было отмечено Nalik как решение

Решение

Цитата Сообщение от Nalik Посмотреть сообщение
Только для этого RGB нужно разбить на отдельные составляющие и занести их в переменные, но вот как это сделать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
COLORREF minLimit = RGB(1,10,0); //на абум, я не знаю, какой именно тебе диапазон красного нужен
COLORREF maxLimit = RGB(255,56,133); //на абум, я не знаю, какой именно тебе диапазон красного нужен
 
//...
 
HDC hdc=GetDC(Handle);
COLORREF d = GetPixel (hdc, 393, 63); // координаты определения пикселя
if(GetRValue(d) >= GetRValue(minLimit) && GetRValue(d) <= GetRValue(maxLimit))
{
    if(GetGValue(d) >= GetGValue(minLimit) && GetGValue(d) <= GetGValue(maxLimit))
    {
        if(GetBValue(d) >= GetBValue(minLimit) && GetBValue(d) <= GetBValue(maxLimit))
        {
            //ЕДРЁНА ВОЖЬ!!!!  ПИКСЕЛЬ В НУЖНОМ ДИАПАЗОНЕ! КРУТО! :-)))))))))))))
            //НАВЕРНОЕ ТУТ МНЕ НАДО ЧТО - ТО СДЕЛАТЬ...
        }
    }
}
0
Kuzia domovenok
2832 / 2419 / 619
Регистрация: 25.03.2012
Сообщений: 8,621
Записей в блоге: 1
Завершенные тесты: 1
07.05.2014, 14:29 7
newbie666, гиблое дело. лучше оченивать среднеквадратичное отклонение трёх компонент цвета.
0
mimicria
return (true);
1963 / 1100 / 219
Регистрация: 19.04.2011
Сообщений: 2,345
07.05.2014, 14:31 8
Предполагаю, что любой цвет, в котором выполняются условия R>G, R>B, а B и G малы и примерно равны между собой, можно считать красным
0
Nalik
131 / 83 / 40
Регистрация: 30.11.2012
Сообщений: 973
07.05.2014, 14:40  [ТС] 9
newbie666, всё ок
C++
1
//ЕДРЁНА ВОЖЬ!!!!  ПИКСЕЛЬ В НУЖНОМ ДИАПАЗОНЕ! КРУТО! :-)))))))))))))
НО, через минуту использования программы весь комп начинает жутко лагать, до тех пор пока программа не будет закрыта..
0
newbie666
Заблокирован
07.05.2014, 14:42 10
Цитата Сообщение от mimicria Посмотреть сообщение
Предполагаю, что любой цвет, в котором выполняются условия R>G, R>B, а B и G малы и примерно равны между собой, можно считать красным
ну смотря для каких целей и смотря на сколько ты дальтоник
На самом деле оттенков красного может быть немерено .... Просто зайди в Paint или PhotoShop и сам определись, что можно считать красным, а что - нет

Добавлено через 1 минуту
Цитата Сообщение от Nalik Посмотреть сообщение
НО, через минуту использования программы весь комп начинает жутко лагать, до тех пор пока программа не будет закрыта..
ну тогда показывай весь код, скорее всего ты не удаляешь динамически выделенную память или не освобождаешь объекты GDI
0
Nalik
131 / 83 / 40
Регистрация: 30.11.2012
Сообщений: 973
07.05.2014, 14:53  [ТС] 11
Файл с функцией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void test (HWND Handle) 
{
    COLORREF minLimit = RGB(110,11,11); //на абум, я не знаю, какой именно тебе диапазон красного нужен
    COLORREF maxLimit = RGB(189,163,177); //на абум, я не знаю, какой именно тебе диапазон красного нужен
 
    HDC hdc=GetDC(Handle);
    COLORREF  d = GetPixel (hdc, 7-3, 58-25); // координаты определения пикселя
    if(GetRValue(d) >= GetRValue(minLimit) && GetRValue(d) <= GetRValue(maxLimit))
    {
        if(GetGValue(d) >= GetGValue(minLimit) && GetGValue(d) <= GetGValue(maxLimit))
        {
             if(GetBValue(d) >= GetBValue(minLimit) && GetBValue(d) <= GetBValue(maxLimit))
             {
                   cout <<"ЕДРЁНА ВОЖЬ!!!!  ПИКСЕЛЬ В НУЖНОМ ДИАПАЗОНЕ! КРУТО! :-)))))))))))))\n";
                   Sleep(1000);
                    //НАВЕРНОЕ ТУТ МНЕ НАДО ЧТО - ТО СДЕЛАТЬ...
             }
        }
    }
}
Вызов функции:

C++
1
2
3
4
5
6
7
void mode2 (HWND Handle)
{
    while(1)
    {
        test (Handle);
    }
}
больше никаких действий не выполняется
0
newbie666
Заблокирован
07.05.2014, 15:09 12
Лучший ответ Сообщение было отмечено Nalik как решение

Решение

Цитата Сообщение от Nalik Посмотреть сообщение
больше никаких действий не выполняется
Ну попробуй в конце функции test написать:
C++
1
ReleaseDC(Handle, hdc);
может и поможет... А так то - весь код вообще нужен
1
Nalik
131 / 83 / 40
Регистрация: 30.11.2012
Сообщений: 973
07.05.2014, 17:42  [ТС] 13
Цитата Сообщение от newbie666 Посмотреть сообщение
может и поможет... А так то - весь код вообще нужен
Помогло, спасибо!)
Забыл память чистить)
0
07.05.2014, 17:42
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 17:42

Как увидеть значение цвета пикселя экрана?
Ситуация такая: надо увидеть значение цвета пикселя экрана, чтоб забить его в константу для...

Как сделать сделать ввод чисел в Input формы строго по нужному диапазону?
Здравствуйте уважаемые Коллеги! У меня есть переменная JS с количеством товаров на складе var...

Как ускорить выполнение кода? (Получение цвета пикселя, сравнение и выполнение действия)
Всем привет. Нужна консультация экспертов) Программа такая. Есть пиксель на экране, в нем то...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.