Как проверить несколько пикселей следующих друг за другом?

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Alloc22, 12 Nov 2015.

  1. Alloc22

    Alloc22 New Member

    Joined:
    12 Oct 2015
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Здравствуйте, в программировании я новичек поэтому прошу у вас помощи, надеюсь вы поможете мне решить довольно простую задачу, хотя для меня это пока сложновато...

    Вообщем суть такова. На экране каждые 30 мс проверяется цвет пикселя по определенным координатам. Я использую стандартный таймер.

    Code:
    PointColor:= GetPixel(PointDC,Point.X,Point.Y);
    r:=GetRValue(PointColor);
    g:=GetGValue(PointColor);
    b:=GetBValue(PointColor);
    
    if ((r>=250) and (r<=255)) and ((g>=250) and (g<=255)) and ((b>=170) and (b<=186)) then ...
    
    Что бы было понятно, есть фигурки (прямоугольник вертикальный и горизонтальный) которые перемещаются по горизонтали и нужно их распознать таким способом. Цвет фигурок одинаковый. Идея такая.

    Если мы нашли нужный цвет начинаем считать сколько у нас таких пикселей, если больше 20 значит это горизонтальный прямоугольник если меньше вертикальный..

    Как это реализовать?
    Понимаю, что есть масса других решений этой задачи, но мне нужно конкретно этот.

    Заранее спасибо!
     
  2. Fanavana

    Fanavana Member

    Joined:
    10 Nov 2015
    Messages:
    28
    Likes Received:
    22
    Reputations:
    1
    Вкратце так... Введи 2 переменные. Одна будет счетчиком кол-ва пикселей, вторая определять тип прямоугольника.
    while
    ((r>=250) and (r<=255)) and ((g>=250) and (g<=255)) and ((b>=170) and (b<=186))
    { счетчик++;
    координата++;
    }
    if (счетчик == 20) тип прямоугольника = 1;
    else if (счетчик < 20) тип прямоугольника = 2;
     
    Alloc22 likes this.
  3. Alloc22

    Alloc22 New Member

    Joined:
    12 Oct 2015
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0

    Спасибо за подсказку. Я сделал как вы советовали, примерно вот так:

    Code:
    Count:=0;
    
    while ((r>=250) and (r<=255)) and ((g>=250) and (g<=255)) and ((b>=170) and (b<=186)) do
    begin 
      Count:=Count+1;  
    end;  
    
    if Count > 20 then 
    begin
      // Выполняем одно действие
      Up:= 0;
    end;
    
    
    но приложение зависает в момент когда появляется этот цвет.. может быть я что то не так делаю?
     
    #3 Alloc22, 12 Nov 2015
    Last edited: 12 Nov 2015
  4. Fanavana

    Fanavana Member

    Joined:
    10 Nov 2015
    Messages:
    28
    Likes Received:
    22
    Reputations:
    1
    Приложение не зависает. Оно завершает свою работу. Ты не смещаещь координату. Программа проверяет один пиксель, добавляет +1 к счетчику и цикл на этом послушно завершается. Там всего одна инструкция. (А должно быть 2 :) т.е. еще координата++; ). И не забывай что в программировании счет начинается с нуля. То есть, если у тебя будет 20 пикселей, то счетчик примет значение 19. Можно задать ему изначальное значение 1.
     
    Alloc22 likes this.
  5. M_script

    M_script Members of Antichat

    Joined:
    4 Nov 2004
    Messages:
    2,581
    Likes Received:
    1,317
    Reputations:
    1,557
    Про смещение координат написал правильно, а вывод сделал неправильный =)
    Если цвет совпадает, программа попадает в бесконечный цикл while.
     
    Alloc22 and Fanavana like this.
  6. Fanavana

    Fanavana Member

    Joined:
    10 Nov 2015
    Messages:
    28
    Likes Received:
    22
    Reputations:
    1
    Да, точно :)
     
    Alloc22 likes this.
  7. Alloc22

    Alloc22 New Member

    Joined:
    12 Oct 2015
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Спасибо ребята за ответы. Дело в том, что как я говорил выше все это происходит в таймере с интервалом в 30 мс и эти самые фигурки они не стоят на месте а двигаются слева на право.. а пиксель который я проверяю находится в конкретной точке.. т.е. как мне кажется смещать координату в данном случае не имеет смысла.. или я ошибаюсь? И приложение все так и зависает, форма перестает отвечать..

    Вообще как я думаю, вроде бы все правильно и логично, не понимаю почему так происходит.. Таймер срабатывает, начинается цикл While, и пока цвет нужный нам мы считаем, когда уже фигурка прошла зону нашей проверки цикл заканчивается... вроде все правильно...
     
  8. Alloc22

    Alloc22 New Member

    Joined:
    12 Oct 2015
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    Кажется я понял в чем проблема.. После того как мы получили цвет пикселя мы действительно входим в бесконечный цикл, так как цвет остается неизменным... т.е. получается в самом цикле нужно брать цвет пикселя:

    Code:
    PointColor:= GetPixel(PointDC,Point.X,Point.Y);
    r:=GetRValue(PointColor);
    g:=GetGValue(PointColor);
    b:=GetBValue(PointColor);
    
    while ((r>=250) and (r<=255)) and ((g>=250) and (g<=255)) and ((b>=170) and (b<=186)) do
    begin
      PointColor:= GetPixel(PointDC,Point.X,Point.Y);
      r:=GetRValue(PointColor); 
      g:=GetGValue(PointColor);
      b:=GetBValue(PointColor);
      
      Count:= Count+1;
    end;
    
    if Count > 20 then ... else ...
    
    
    но теперь еще одна проблема возникла.. Count получается большим.. Сама фигурка имеет 25 пикселей в ширину, а Caunt мне показывает 60-90.. почему так?
     
  9. Fanavana

    Fanavana Member

    Joined:
    10 Nov 2015
    Messages:
    28
    Likes Received:
    22
    Reputations:
    1
    Прошу пардона. Если как ты говоришь, "все это происходит в таймере", то нужно использовать условие if вместо while и если фигурки движутся только в одну сторону, то логичнее проверять цвет в одной точке и прибавлять единицу к счетчику за один цикл таймера. Программа зацикливалась протому, что цвет проверялся без смещения фигурки и условие было посоянно истинным.
     
    Alloc22 likes this.
  10. Alloc22

    Alloc22 New Member

    Joined:
    12 Oct 2015
    Messages:
    16
    Likes Received:
    0
    Reputations:
    0
    так в том то и дело, что цвет фигурок одинаковый)) вот и мучаюсь)