Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
07.05.2014, 12:25     Как сделать проверку по диапазону цвета пикселя? #1
Подскажите пожалуйста, как сделать проверку по диапазону цвета пикселя.
Т.е. цвет пикселя в координатах постоянно меняется(мигает красным), я хочу взять самый светлый красный цвет и самый темный и сделать так, чтобы при всех значениях цвета пикселя в приделах указанного диапазона, программа понимала, что это именно то что нужно.

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

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 цветов..подскажите пожалуйста как сделать..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
newbie666
Заблокирован
07.05.2014, 12:29     Как сделать проверку по диапазону цвета пикселя? #2
Цитата Сообщение от Nalik Посмотреть сообщение
то мне нужно задать диапазон RGB цветов
ну вот ты сначала определись с этим диапазоном, а потом каждую составляющую пикселя сверяй с диапазоном, ну типа если текущая RED составляющая цвета >= min диапазона и <= max диапазона RED, то проверяй следующую, если все в диапазоне - всё ок
stima
430 / 285 / 16
Регистрация: 22.03.2011
Сообщений: 929
Завершенные тесты: 1
07.05.2014, 12:39     Как сделать проверку по диапазону цвета пикселя? #3
А зачем Вам "operator ,"?
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.05.2014, 12:42     Как сделать проверку по диапазону цвета пикселя? #4
Задача стрёмно сформулирована.Такое чувство, что ты экран чужого приложения читаеш, хакер, блин...
Даже если так, ты должен чётко сказать, что ты хочешь распознать на экране.
Отталкиваться надо не только от цвета твоего пикселя, но и от цветов соседних.
Расчитывать, например контрастность этого пикселя на фоне остальных...
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
07.05.2014, 12:53  [ТС]     Как сделать проверку по диапазону цвета пикселя? #5
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Задача стрёмно сформулирована.Такое чувство, что ты экран чужого приложения читаеш, хакер, блин...
Даже если так, ты должен чётко сказать, что ты хочешь распознать на экране.
Отталкиваться надо не только от цвета твоего пикселя, но и от цветов соседних.
Расчитывать, например контрастность этого пикселя на фоне остальных...
не трудно догадаться, по Handle))

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

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

Что-то типо того?
R = a;
G = b;
B = c;
newbie666
Заблокирован
07.05.2014, 13:37     Как сделать проверку по диапазону цвета пикселя? #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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))
        {
            //ЕДРЁНА ВОЖЬ!!!!  ПИКСЕЛЬ В НУЖНОМ ДИАПАЗОНЕ! КРУТО! :-)))))))))))))
            //НАВЕРНОЕ ТУТ МНЕ НАДО ЧТО - ТО СДЕЛАТЬ...
        }
    }
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
07.05.2014, 14:29     Как сделать проверку по диапазону цвета пикселя? #7
newbie666, гиблое дело. лучше оченивать среднеквадратичное отклонение трёх компонент цвета.
mimicria
return (true);
 Аватар для mimicria
1956 / 1093 / 91
Регистрация: 19.04.2011
Сообщений: 2,344
07.05.2014, 14:31     Как сделать проверку по диапазону цвета пикселя? #8
Предполагаю, что любой цвет, в котором выполняются условия R>G, R>B, а B и G малы и примерно равны между собой, можно считать красным
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
07.05.2014, 14:40  [ТС]     Как сделать проверку по диапазону цвета пикселя? #9
newbie666, всё ок
C++
1
//ЕДРЁНА ВОЖЬ!!!!  ПИКСЕЛЬ В НУЖНОМ ДИАПАЗОНЕ! КРУТО! :-)))))))))))))
НО, через минуту использования программы весь комп начинает жутко лагать, до тех пор пока программа не будет закрыта..
newbie666
Заблокирован
07.05.2014, 14:42     Как сделать проверку по диапазону цвета пикселя? #10
Цитата Сообщение от mimicria Посмотреть сообщение
Предполагаю, что любой цвет, в котором выполняются условия R>G, R>B, а B и G малы и примерно равны между собой, можно считать красным
ну смотря для каких целей и смотря на сколько ты дальтоник
На самом деле оттенков красного может быть немерено .... Просто зайди в Paint или PhotoShop и сам определись, что можно считать красным, а что - нет

Добавлено через 1 минуту
Цитата Сообщение от Nalik Посмотреть сообщение
НО, через минуту использования программы весь комп начинает жутко лагать, до тех пор пока программа не будет закрыта..
ну тогда показывай весь код, скорее всего ты не удаляешь динамически выделенную память или не освобождаешь объекты GDI
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
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);
    }
}
больше никаких действий не выполняется
newbie666
Заблокирован
07.05.2014, 15:09     Как сделать проверку по диапазону цвета пикселя? #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Nalik Посмотреть сообщение
больше никаких действий не выполняется
Ну попробуй в конце функции test написать:
C++
1
ReleaseDC(Handle, hdc);
может и поможет... А так то - весь код вообще нужен
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 17:42     Как сделать проверку по диапазону цвета пикселя?
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Nalik
 Аватар для Nalik
44 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 582
07.05.2014, 17:42  [ТС]     Как сделать проверку по диапазону цвета пикселя? #13
Цитата Сообщение от newbie666 Посмотреть сообщение
может и поможет... А так то - весь код вообще нужен
Помогло, спасибо!)
Забыл память чистить)
Yandex
Объявления
07.05.2014, 17:42     Как сделать проверку по диапазону цвета пикселя?
Ответ Создать тему
Опции темы

Текущее время: 19:21. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru