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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Nalik
39 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 646
#1

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

07.05.2014, 12:25. Просмотров 724. Ответов 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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.05.2014, 12:25
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать проверку по диапазону цвета пикселя? (C++):

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

Получением цвета пикселя из игры - C++
Добрый день! Я пытаюсь получить цвет пикселя из игры WoW Использую такой код: void main() { int x = 1102; int y = 272; ...

Изменение цвета пикселя в opencv - C++
Добрый вечер. Скажите, пожалуйста, есть ли какой-либо метод у opencv, который выполняет преобразование с изображением, делая его более...

Определение пикселя цвета в координатах - C++
Подскажите пожалуйста, как можно определить цвет пикселя в указанных координатах на с++ в окне, которое находим по хендлу? Использую...

Считывание пикселя и вывод на экран его цвета - C++
Подскажите пожалуйста, как это можно реализовать или где про это можно что-то прочитать. Есть 2мерная матррица,которая складывается друг...

C++ Поиск пикселя заданного цвета и замена другим. - C++
Ребята, помогите пожалуйста с решением задачи. Кучу документации перекопала - никак не могу найти решение. Нужно разработать программу,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
newbie666
Заблокирован
07.05.2014, 12:29 #2
Цитата Сообщение от Nalik Посмотреть сообщение
то мне нужно задать диапазон RGB цветов
ну вот ты сначала определись с этим диапазоном, а потом каждую составляющую пикселя сверяй с диапазоном, ну типа если текущая RED составляющая цвета >= min диапазона и <= max диапазона RED, то проверяй следующую, если все в диапазоне - всё ок
0
stima
473 / 322 / 30
Регистрация: 22.03.2011
Сообщений: 1,046
Завершенные тесты: 2
07.05.2014, 12:39 #3
А зачем Вам "operator ,"?
0
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.05.2014, 12:42 #4
Задача стрёмно сформулирована.Такое чувство, что ты экран чужого приложения читаеш, хакер, блин...
Даже если так, ты должен чётко сказать, что ты хочешь распознать на экране.
Отталкиваться надо не только от цвета твоего пикселя, но и от цветов соседних.
Расчитывать, например контрастность этого пикселя на фоне остальных...
0
Nalik
39 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 646
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 Посмотреть сообщение
Только для этого 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
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,925
Записей в блоге: 1
07.05.2014, 14:29 #7
newbie666, гиблое дело. лучше оченивать среднеквадратичное отклонение трёх компонент цвета.
0
mimicria
return (true);
1957 / 1094 / 91
Регистрация: 19.04.2011
Сообщений: 2,345
07.05.2014, 14:31 #8
Предполагаю, что любой цвет, в котором выполняются условия R>G, R>B, а B и G малы и примерно равны между собой, можно считать красным
0
Nalik
39 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 646
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
39 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 646
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 Посмотреть сообщение
больше никаких действий не выполняется
Ну попробуй в конце функции test написать:
C++
1
ReleaseDC(Handle, hdc);
может и поможет... А так то - весь код вообще нужен
1
Nalik
39 / 25 / 9
Регистрация: 30.11.2012
Сообщений: 646
07.05.2014, 17:42  [ТС] #13
Цитата Сообщение от newbie666 Посмотреть сообщение
может и поможет... А так то - весь код вообще нужен
Помогло, спасибо!)
Забыл память чистить)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2014, 17:42
Привет! Вот еще темы с ответами:

Считывание цвета пикселя конкретного окна в конкретном месте - C++
Добрый день. Помогите пожалуйста. Какбы нужно в конкретном окне программы при нажатии кнопкой мыши считать цвет и каординаты положения...

точку нужно отобразить в виде пикселя. как это сделать - C++
/*Реализовать класс Graphic, который позволяет рисовать на экране консоли различные геометрические фигуры. Разнести проект по файлам. ...

Выполнить определение цвета пикселя при вождении мышкой по компоненту TImage - C++
В программе мне необходимо выполнять определение цвета пикселя при вождении мышкой по компоненту TImage. Подскажите пожалуйста как можно...

Как сделать проверку на ввод? С++ - C++
y=2*(tgx+sinx/2); tgx стремится к бесконечности когда cos(x) стремится к нулю надо сделать проверку на это, и вывести сообщения об...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
07.05.2014, 17:42
Ответ Создать тему
Опции темы

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