Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Проверка цвета определенного пикселя


Автор: Tokagero 17.8.2007, 14:30
Суть в том чтоб делать скриншот раз в секунду гдето и проверять, если пиксель НЕ такого-то цвета тогда имитировать нажатие ф1 ... Создание для онлайн-игры програмки для автоматического использования зелий (проверка строки жизни)... Как проверить является ли пиксель нужного цвета?

Автор: Mikh@il 17.8.2007, 22:58
Пиксель состоит из трех-каналов(для RGB-палитры), получи значения красного, зеленого и синего.
Значения цвета канала от 0 до 255.

Вот те пример
Код



 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:= ---- это синий;
          p[x-2]:= ---- это зеленый;
          p[x-1]:= ---- это красный;
         end;







  А вообще как я понял суть твоей проблемы тебе надо сравнивать твою картинку(полоску жизней) с полной полоской жизни (100%-здоровье), так есть решение проще, берешь считаешь к-во пикселей в твоей полоске (это делаешь один единственный раз), после чего когда твои жизни уменьшаются твои действия следующие:

1. Предположим в полоске уровень жизни обозначен красным цветом
2. Считаешь к-во красных пикселей
3. Полученный результат  делишь на к-во пикселей во всей полоске (результат больше единицы быть не может, если еще и на 100% умножить то получишь процент здоровья, если он меньше 100 - то вливаешь в себе бутыль пива и закусываешь рыбкой и у тя опять 100% здоровья)

Добавлено через 2 минуты и 44 секунды
Пиксель состоит из трех-каналов(для RGB-палитры), получи значения красного, зеленого и синего.
Значения цвета канала от 0 до 255.

Вот те пример
Код



 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:= ---- это синий;
          p[x-2]:= ---- это зеленый;
          p[x-1]:= ---- это красный;
         end;







  А вообще как я понял суть твоей проблемы тебе надо сравнивать твою картинку(полоску жизней) с полной полоской жизни (100%-здоровье), так есть решение проще, берешь считаешь к-во пикселей в твоей п

Добавлено через 2 минуты и 57 секунд
Пиксель состоит из трех-каналов(для RGB-палитры), получи значения красного, зеленого и синего.
Значения цвета канала от 0 до 255.

Вот те пример
Код



 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:= ---- это синий;
          p[x-2]:= ---- это зеленый;
          p[x-1]:= ---- это красный;
         end;







  А вообще как я понял суть твоей проблемы тебе надо сравнивать твою картинку(полоску жизней) с полной полоской жизни (100%-здоровье), так есть решение проще, берешь считаешь к-во пикселей в твоей п

Автор: Tokagero 18.8.2007, 09:13
Mikh@il, Большое спасибо но моя идея немного другая...

Я проверяю только один  пиксель полоски.  Допустим, всего 100 жизней. А зелья восполняют 25. Я беру примерно 70-75ый пиксель и проверяю Если он такого-то (светлокрасного) цвета то ничего, а если она НЕ этого (темнокрасного, типа пустое) то тогда имитировать F1 (зелье)... 
Еще одна проблема - на скриншоте наверно цвета будут... не очень качественные и часто пиксели будут изза качества изображения иметь искаженный цвет

Автор: Mikh@il 18.8.2007, 09:56
Tokagero - у тя на картинке очень красивые цифорки жизней, белые и ровненькие, я бы распозновал их. 
1. Проведи бинаризацию, все что не белое будет черные, а все что белое останется белым, после чего выдели границы цифорок по вертикали (по горизонтали не надо, т.к. у тя цифры в одну строку), и сравни с эталоном (В эталон нарежь цифры из этой же картинки их всего будет - 10)
Работать будет быстро, а погрешности никакой.

Автор: Tokagero 18.8.2007, 12:55
Mikh@il, заманчиво но звучит сложно. Есть примеры?

Автор: Mikh@il 19.8.2007, 10:31
Если распознать сложно делай по пикселам.

1. Для простоты преобразуешь изо-ение в оттенки серого:
Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y:=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения во все три канала (R=G=B:=Y). 

Код

  Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:=Round(0.11*P[x-3]+0.59*p[x-2]+0.3*p[x-1]);
          p[x-2]:=p[x-3];
          p[x-1]:=p[x-2];
         end;
   end;



2. Проверяешь пикселы
 
Берешь первую строку сканируешь и заносишь в массив 
Код

  
 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
   P:=Image1.Picture.Bitmap.ScanLine[0];                             // ТУТ P - это массив P:PbyteArray;
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
         if p[x-3]<>'Нужному значению яркости пиксела' then ТУТ КОД Эмуляции нажатия F1 для принятия зелья ;
         end;




Вот и все!

Добавлено через 2 минуты и 45 секунд
Если распознать сложно делай по пикселам.

1. Для простоты преобразуешь изо-ение в оттенки серого:
Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y:=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения во все три канала (R=G=B:=Y). 

Код

  Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:=Round(0.11*P[x-3]+0.59*p[x-2]+0.3*p[x-1]);
          p[x-2]:=p[x-3];
          p[x-1]:=p[x-2];
         end;
   end;



2. Проверяешь пикселы
 
Берешь первую строку сканируешь и заносишь в массив 
[code=delphi]
  
 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
   P:=Image1.Picture.Bitmap.ScanLine[0];

Добавлено через 2 минуты и 57 секунд
Если распознать сложно делай по пикселам.

1. Для простоты преобразуешь изо-ение в оттенки серого:
Преобразование к оттенкам серого заключается в получении яркости каждой точки по известной формуле (Y:=0.3*R+0.59*G+0.11*B) и последующем копировании полученного значения во все три канала (R=G=B:=Y). 

Код

  Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
  for y:=0 to Image1.Picture.Bitmap.Height-1 do
   begin
    P:=Image1.Picture.Bitmap.ScanLine[y];
     for x:=3 to 3*Image1.Picture.Bitmap.Width do
        if x mod 3=0 then
         begin
          p[x-3]:=Round(0.11*P[x-3]+0.59*p[x-2]+0.3*p[x-1]);
          p[x-2]:=p[x-3];
          p[x-1]:=p[x-2];
         end;
   end;



2. Проверяешь пикселы
 
Берешь первую строку сканируешь и заносишь в массив 
[code=delphi]
  
 Image1.Picture.Bitmap.PixelFormat:=PF24Bit;
   P:=Image1.Picture.Bitmap.ScanLine[0];

Автор: pseud 21.8.2007, 10:07
Цитата(Tokagero @  17.8.2007,  14:30 Найти цитируемый пост)
Как проверить является ли пиксель нужного цвета?


у компонента TCanvas есть такая пропертя:
Код

property Pixels[X, Y: Integer]: TColor;


вот и делай

Код

var 
  cnv: Tcanvas;
begin
  cnv := ...
  if cnv.Pixels[100, 10] = clGreen then
    Хайль гитлер



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)