|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Поиск мерцающей точки на скрине
Ув.программисты, помогите пожалуйста найти оптимальное решение.
Программа делает скрин, вырезает определенную его часть и делает поиск количества пикселов определенного цвета, данной функцией: Код:
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
|
|||
|
|||
мерцает от красного к белому, плавно?
|
#3
|
|||
|
|||
Цитата:
Последний раз редактировалось AlekseySV, 04.10.2011 в 11:43. |
#4
|
|||
|
|||
можно как-нибудь через colortorgb
там r - оттенок красного g должно быть примерно равно b на крайний случай придётся преобразовать rgb в hsv или hls Последний раз редактировалось Pyro, 04.10.2011 в 11:51. |
#5
|
|||
|
|||
Насчет RGB не представляю возможным применение, я пытался вычислить R и изначально думал что если R > B и R > G то будет примерно красный но к сожалению желтый цвет к примеру имеет: R = 255, G = 225, B = 105 ,как здесь понять что это желтый а не красный? (примерно сравнивать B и G , насколько примерно ? ). Я уверен есть правильное решение, но какое... (код должен быть не только правильный, но и максимально быстрый.)
Последний раз редактировалось AlekseySV, 04.10.2011 в 12:55. |
#6
|
|||
|
|||
тогда rgbtohsv поможет
h - оттенок спектра, красный в начале вообще без скринов состояний этой точки трудно что-либо конкретное советовать |
#7
|
|||
|
|||
Насчет rgbtohsv с определением значения h, я думаю даст нужный результат, но преобразование Color в RGB, а затем в HSV да еще и для каждого пиксела однозначно ударит по производительности.
Вечером прийду с работы, попробую применить rgbtohsv в коде, о результате отпишусь. |
#8
|
|||
|
|||
Используйте xor пикселей только что полученной картинки с пикселями картинки, полученной некоторое время назад. При совпадении получите 0 (пиксель не менялся => не мерцает => анализировать не надо), при отличиях - не ноль. Определить правильно красный будет так: (R>200)and(G<50)and(B<50). Или так: (R>G+B+100). Или еще кучей способов. Все они в большей или меньшей степени работоспособны. Конкретные числа определите сами в зависимости от обстоятельств.
И еще. Используйте bmp.ScanLine, без нее все будет очень-очень медленно. И перед обработкой сделайте так: bmp.PixelFormat:=pf24bit - много времени не займет а от неприятных сюрпризов избавит. P.S. Уберите эту бессмыссленную переменную Resultat, замените ее на Result. |