Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 04.10.2011, 11:27
AlekseySV AlekseySV вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 4
Репутация: 10
Плохо Поиск мерцающей точки на скрине

Ув.программисты, помогите пожалуйста найти оптимальное решение.
Программа делает скрин, вырезает определенную его часть и делает поиск количества пикселов определенного цвета, данной функцией:
Код:
Function PoiskCveta(Skrin:TBitmap;Color1:Cardinal;Color2:Cardinal): Integer;
var
  x, y: Integer;
  bm: TBitmap;
  Resultat: Integer;
begin
  Resultat:= 0;
  bm := TBitmap.Create;
  bm.Assign (Skrin);
  for x:=1 to bm.Width  do
    for y:=1 to bm.Height do
      if (bm.Canvas.Pixels[x,y]=Color1) Or (bm.Canvas.Pixels[x,y]=Color2) then
      Begin
      Resultat:= Resultat + 1;
     End;
     bm.Free;
     Result:=Resultat;
end;
Админ: Пользуемся тегами для оформления кода.

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

Последний раз редактировалось Admin, 04.10.2011 в 12:12.
Ответить с цитированием
  #2  
Старый 04.10.2011, 11:35
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

мерцает от красного к белому, плавно?
Ответить с цитированием
  #3  
Старый 04.10.2011, 11:41
AlekseySV AlekseySV вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

Цитата:
Сообщение от Pyro
мерцает от красного к белому, плавно?
Нет,мерцает именно красным от темно-красного до более светло-красного

Последний раз редактировалось AlekseySV, 04.10.2011 в 11:43.
Ответить с цитированием
  #4  
Старый 04.10.2011, 11:45
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

можно как-нибудь через colortorgb
там r - оттенок красного
g должно быть примерно равно b
на крайний случай придётся преобразовать rgb в hsv или hls

Последний раз редактировалось Pyro, 04.10.2011 в 11:51.
Ответить с цитированием
  #5  
Старый 04.10.2011, 12:49
AlekseySV AlekseySV вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

Насчет RGB не представляю возможным применение, я пытался вычислить R и изначально думал что если R > B и R > G то будет примерно красный но к сожалению желтый цвет к примеру имеет: R = 255, G = 225, B = 105 ,как здесь понять что это желтый а не красный? (примерно сравнивать B и G , насколько примерно ? ). Я уверен есть правильное решение, но какое... (код должен быть не только правильный, но и максимально быстрый.)

Последний раз редактировалось AlekseySV, 04.10.2011 в 12:55.
Ответить с цитированием
  #6  
Старый 04.10.2011, 12:57
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

тогда rgbtohsv поможет
h - оттенок спектра, красный в начале

вообще без скринов состояний этой точки трудно что-либо конкретное советовать
Ответить с цитированием
  #7  
Старый 04.10.2011, 14:35
AlekseySV AlekseySV вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 4
Репутация: 10
По умолчанию

Насчет rgbtohsv с определением значения h, я думаю даст нужный результат, но преобразование Color в RGB, а затем в HSV да еще и для каждого пиксела однозначно ударит по производительности.
Вечером прийду с работы, попробую применить rgbtohsv в коде, о результате отпишусь.
Ответить с цитированием
  #8  
Старый 05.10.2011, 07:21
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Используйте xor пикселей только что полученной картинки с пикселями картинки, полученной некоторое время назад. При совпадении получите 0 (пиксель не менялся => не мерцает => анализировать не надо), при отличиях - не ноль. Определить правильно красный будет так: (R>200)and(G<50)and(B<50). Или так: (R>G+B+100). Или еще кучей способов. Все они в большей или меньшей степени работоспособны. Конкретные числа определите сами в зависимости от обстоятельств.

И еще. Используйте bmp.ScanLine, без нее все будет очень-очень медленно. И перед обработкой сделайте так: bmp.PixelFormat:=pf24bit - много времени не займет а от неприятных сюрпризов избавит.

P.S. Уберите эту бессмыссленную переменную Resultat, замените ее на Result.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter