Что нового

Как подсчитать кол-во пикселей определенного цвета в заданной области

Сообщения
18
Репутация
0
Здравствуйте. Я новичок в autoit писании. Пытаюсь написать простенький бот и столкнулся с такой проблемой - существует прямоугольник, часть которого окрашена одним цветом(скажем белым), а другая вторым(скажем черным). Изначально этот прямоугольник появляется окрашенный этими цветами примерно пополам. Далее кол-во пикселей одного из цветов уменьшается, а другого увеличивается, тем самым происходит движение "влево-вправо" вложенных цветных прямоугольников один из которых становится короче, другой длиннее. Хочу сделать бот, который бы считал кол-во черных пикселей в заданной мной области, затем sleep(500), потом повторный подсчет черных пикселей в той же области. Далее если их кол-во не изменилось или стало больше то производилось действие(скажем send (1)), если их кол-во стало меньше то производилось второе действие(скажем send(2)). Чтобы хоть немного объяснить что я только что написал выкладываю примеры нарисованные мной в пейнте ;D
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
А зачем подсчитывать количество? Можно же просто найти через
Код:
PixelSearch()
первый черный пиксель и по его координатам будет понятно сколько белого, сколько черного.
 
Автор
А
Сообщения
18
Репутация
0
а каким образом я "объясню" программе черного цвета стало больше или меньше с момента последней проверки? Или может я чего то не понял? :-[
 
Автор
А
Сообщения
18
Репутация
0
Если я правильно понял, то вы предлагаете запустить поиск пикселя в заданной области. Поиск начнется с левого верхнего края. Как только будет найден первый черный пиксель то функция вычислит его координаты и будет должна сравнить их с координатами черного пикселя с прошлой проверки? Вот только как их сравнить? Пытаюсь понять, но пока не получается :wacko:
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Через PixelSearch()
Код:
$coord = PixelSearch( 1, 1, 5, 1, 0x000000)
If Not @error Then
    Switch $Coord[0]
	Case 1
		msgbox(0,"Цвет", "5 черных, 0 белых")
	Case 2
		msgbox(0,"Цвет", "4 черных, 1 белый")
	Case 3
		msgbox(0,"Цвет", "3 черных, 2 белых")
	Case 4
		msgbox(0,"Цвет", "2 черных, 3 белых")
	Case 5
		msgbox(0,"Цвет", "1 черный, 4 белых")
	EndSwitch
Else
	msgbox(0,"Цвет", "0 черных, 5 белых")
EndIf

Через PixelGetColor()
Код:
$_vsego_pixel=5
$black=0
For $i=1 to $_vsego_pixel
$color=PixelGetColor($i, 1)
If $color=0x000000 then $black+=1
Next
Msgbox(0,"","Черных = " & $black ", Белых = " & $_vsego_pixel-$black)
 
Автор
А
Сообщения
18
Репутация
0
Огромное спасибо за информацию, уже узнал много нового) С моей стороны не будет слишком большой наглостью если я попрошу вас объяснить как "слепить" все это в один непрерывный цикл с send 1 и send 2 соответственно? Если слишком наглею, то хотя бы на словах объясните) :beer:
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
В конце добавь
Код:
If $black>10 then 
send("1") 
elseif $black=10 then
send("2")
endif
и все что получилось в цикл
Код:
while 1
sleep(500)
wend

:Rulz: В справке масса примеров. читать с самого начала.
 
Автор
А
Сообщения
18
Репутация
0
почитал справку, посидел, подумал. Во втором примере вы присваиваете переменной "всего черных" значение 5. Если не секрет как мне узнать сколько мне брать черных пикселей? Вы ведь это значение взяли для примера, и потому оно "с потолка". А у меня то будет совсем другое значение
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Берешь всю полоску... берешь координаты начала и координаты конца... разница как раз и будет количеством пикселей... :smile:
 
Автор
А
Сообщения
18
Репутация
0
Логично) Сейчас попробую дополнение к вопросу по этой теме внести) Вся проблема в том что мне важно отследить изменение по кол-ву пикселей, а не то стал белый прямоугольник больше черного или нет, так как их кол-во изменяется на разную величину и порой доходит до того, что весь прямоугольник становится белым в случае невыполнения действий, либо черным при условии их правильного выполнения)
 
Автор
А
Сообщения
18
Репутация
0
если я правильно понял то логически решение такое: в заданной области начинаем искать черный пиксель. Как только мы его нашли и определили координаты - sleep(500), далее опять ищем черный пиксель. Как только нашли сравниваем его координаты с координатами прошлой проверки. Выясняем сдвинулся ли крайний пиксель и если сдвинулся то в какую сторону(право-лево). Если вправо то send 2, else send1. Правильно ли я понял логику, и если правильно то как мне это реализовать? :-[
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
Если быстро и просто то:
1. Берем пример из PixelSearch.
Код:
$coord = PixelSearch( 0, 0, 20, 300, 0xFF0000 )
If Not @error Then
    MsgBox(0, "X and Y are:", $coord[0] & "," & $coord[1])
EndIf
Чуть-чуть переделываем под свои координаты... понимаем, что $coord[0] это координата найденного пикселя по оси X.
2. Добавляем цикличность... чтобы выполнянлось бесконечно.
Код:
While 1
$coord = PixelSearch( 0, 0, 20, 300, 0xFF0000 )
If Not @error Then
    MsgBox(0, "X and Y are:", $coord[0] & "," & $coord[1])
EndIf
WEnd
Также добавим кнопку, чтобы закрывать по ней скрипт. Пусть будет ESC. (функция может находится в любой части скрипта, а вот hotkeyset желательно объявить сразу) Также добавим sleep(10), чтобы скрипт не грузил полностью ядро процессора.
Код:
HotKeySet("{ESC}","quit")

While 1
$coord = PixelSearch( 0, 0, 20, 300, 0xFF0000 )
If Not @error Then
    MsgBox(0, "X and Y are:", $coord[0] & "," & $coord[1])
EndIf
sleep(10)
WEnd

Func quit()
	Exit
EndFunc

3. Заменяем msgbox на конструкцию из условий... т.е. что будет происходить когда если положение найденной точки будет отличаться
+ добавим что будет если больше или что будет если меньше. (Можно оформить и более правильно через or/and и elseIf, но для наглядности сделал, как будет понятнее для новичка) И также ввел переменную $old с которой будет сравниваться изменилось или нет.
Код:
HotKeySet("{ESC}","quit")
$coord = PixelSearch(0, 0, 20, 300, 0x000000)
$old=$coord[0]

While 1
$coord = PixelSearch(0, 0, 20, 300, 0x000000)
If Not @error Then
	If $old <> $coord[0] then
		If $old>$coord[0] then send("1")
		If $old<$coord[0] then send("2")
	$old=$coord[0]
	sleep(500)
    EndIf
EndIf
sleep(10)
WEnd


Func quit()
	Exit
EndFunc
 
Автор
А
Сообщения
18
Репутация
0
:laugh:скрипт практически работает. Осталось чуть доработать, спасибо вам огромное. Подскажите еще пожалуйста как задать условие if $old равно $coord[0] then действие? Достаточно знака "=" или это будет считаться присваиванием значения?
 
Автор
А
Сообщения
18
Репутация
0
Вообщем сейчас получается такая ситуация. Если нужный нам пиксель был найден и выполнено одно из условий(больше, меньше или равно), то после того как используется send 1 тут же используется send 2 и наоборот(
 

zlo-kazan

Скриптер
Сообщения
374
Репутация
100
= в данном случае это будет сравнение. == это если сравнивать 2 текста, то ещё и с учетом регистра.
Эту часть меняем:
Код:
If $old>$coord[0] then send("1")
        If $old<$coord[0] then send("2")

Меняем на:
Код:
If $old>$coord[0] then ; если условие верно, то...
send("1")
elseIf $old<$coord[0] then ; если 1-е условие не верно, но верно это, то...
send("2") 
EndIf
 
Автор
А
Сообщения
18
Репутация
0
sleep(4000)


$coord = PixelSearch(513, 336, 739, 344, 0x2A1513)
$old=$coord[0]

While 1=1
$coord = PixelSearch(513, 336, 739, 344, 0x2A1513)
If Not @error Then
If $old<$coord[0] then send("3")
ElseIf $old>=$coord[0] then send("2")
$old=$coord[0]
sleep(850)
EndIf
sleep(10)
WEnd



Вот код скрипта. При компиляции выдает ошибку синтаксиса. Причем в строчке с елсифом. Подскажите пожалуйста что не так? :-[
 

Arei

Скриптер
Сообщения
938
Репутация
115
Во первых на форуме принято(обязательно нужно )код обрамлять Тэгами ,
Код:
.
Во вторых "елсифом" такой функции нет или что это,для меня это не понятно, и даже люди понимающие Autoit не смогут, помочь вам из за этих аббревиатур.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 579
Репутация
934
Александр Александрович:
Предупреждение За нарушение правил форума (пункт В.11):
Любые отрывки AutoIt кода необходимо заключать в тег [autoit]
(подробнее), а обычный код соответственно в тег [code]
(подробнее). Также большие выдержки текста помещайте под тег [spoiler]
(подробнее), там где это поддерживается естественно. Как в случае с названием темы, также короткое и эргономичное сообщение привлекает больше внимания, и шансы на получение конкретного ответа увеличиваются.


С уважением, Модератор раздела.







Добавлено:
Сообщение автоматически объединено:

Arei:
If...ElseIf...Else...EndIf
 
Верх