Что нового

Поиск цвета, как сделать чтоб не срабатывал на моргание

dwm18

Новичок
Сообщения
27
Репутация
0
Подскажите, как сделать так, чтобы срабатывал поиск цвета не на моргание точки , а только тогда когда она появилась и застыла ( утвердилась ). А то срабатывает - на моргание сразу - мигом срабатывает, а точка потом не появляется в этом месте. Вот когда появилась и стоит не моргает - тогда нужно, чтоб продолжал скрипт работать...


Код:
While 1
PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7) ; координаты области, цвет, допущение оттенка, шаг поиска
If Not @error Then
SoundPlay("C:\0\zvuk.mp3", 0)
Sleep(300000)
EndIf
Sleep(100)
WEnd
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно попробовать при обнаружении точки проверить её наличие через какой-то промежуток времени:
Код:
While 1
	PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7) ; координаты области, цвет, допущение оттенка, шаг поиска
	If Not @error Then
		Sleep(2000);Время, по истечении которого вновь проверить этот пиксель
		PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7)
		If Not @error Then
			SoundPlay("C:\0\zvuk.mp3", 0)
			Sleep(300000)
		EndIf
	EndIf
	Sleep(100)
WEnd
Можно проверять какое-то время, что точка светит постоянно и не моргает, например так :
Код:
$PixelExist = False
While 1
	PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7) ; координаты области, цвет, допущение оттенка, шаг поиска
	If Not @error Then
		$PixelExist = True
		For $i = 0 To 10 ;Количество циклов, за которое точка не должна потухнуть
			PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7)
			If @error Then
				$PixelExist = False
				ExitLoop
			EndIf
			Sleep(100)
		Next
		If $PixelExist Then
			SoundPlay("C:\0\zvuk.mp3", 0)
			$PixelExist = False
            Sleep (300000)
		EndIf
	EndIf
	Sleep(100)
WEnd
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
Спасибо - вроде должно получится теперь. Вот в цикле код - 1-ин цикл равняется времени ( Sleep 100 ) установленном в конце кода ? - я правильно понимаю ?
:IL_AutoIt_1:
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
dwm18 сказал(а):
Вот в цикле код - 1-ин цикл равняется времени ( Sleep 100 ) установленном в конце кода ? - я правильно понимаю ?
Нет , это пауза (и то весьма приблизительно) с того момента , когда скрипт дойдёт именно до этой строки, ведь он затрачивает своё время на проверку условий, выполнение циклов итп.
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
А как точно вычислить время 1-го цикла тогда ?


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

Что по времени первый скрипт, что по циклам - походу корень один и тот дже, т. е. и там по времени и здесь по времени - только циклы ( циклы тоже задержка по времени ) Суть одна и та же.....
Как сделать так что бы когда точно появилась ( зафиксировался цвет ) - тогда скрипт сработал, а то повторная проверка и циклы срабатывают на моргание :((( ;)
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
А как точно вычислить время 1-го цикла тогда ?
Вот так можно :
Код:
$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
;В этом месте - тот участок кода , время работы которого хотите проверить
;........................................................................
;........................................................................
$iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
ConsoleWrite($iDiff&@CR);Покажет время выполнения участка кода в консоли

а то повторная проверка и циклы срабатывают на моргание
Как оно моргает ? Цвет появился и сразу пропал или , моргает постоянно с какой-то частотой, как считать , что он перестал моргать (сколько по времени он должен быть постоянно) ? Попробуйте во втором варианте изменить (увеличить) количество циклов, в течении которых цвет не должен пропадать...
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
Приветствую :beer:

Точка появляется хаотично - каждый раз, поэтому думаю мы тоже будем искать хаотично ( циклы походу здесь не подойдут ), примерно вот так :

Код:
While 1
    PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7) ; координаты области, цвет, допущение оттенка, шаг поиска
    If Not @error Then
        Sleep(500);Время, по истечении которого вновь проверить этот пиксель
        PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7)
    If Not @error Then
        Sleep(600);Время, по истечении которого вновь проверить этот пиксель
        PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7)
    If Not @error Then
        Sleep(400);Время, по истечении которого вновь проверить этот пиксель
        PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 7)
    If Not @error Then
            SoundPlay("C:\0\zvuk.mp3", 0)
            Sleep(300000)
        EndIf
      EndIf
    EndIf
  EndIf
WEnd

Как думаете пойдет - так ?

В коде если не нашел цвет, он возвращается в начало и ищет ( ждет ) - правильно я понимаю ?

С неактивным окном будет работать ?

За ранее благодарен....
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Как думаете пойдет - так ?
Нет, зачем проверять пиксель через рандомные промежутки времени ? Ведь пиксель может появиться в паузе. Смысл скрипта (второй вариант) такой : ждём нужный пиксель и если найден - в цикле проверяем есть он или потух(моргнул итд) если в течении цикла пиксель не найден, то считается, что моргнул и не засчитывается срабатывание, если найден в каждом из проходов цикла (не тух) , то звуковой сигнал и через паузу всё по новой. Здесь количеством прохода цикла Вы определяете минимальное время, в течении которого засвеченный символ считается не моргнувшим (как то так :smile:)
С неактивным окном будет работать ?
Нет, не будет. Функция определяет цвет пикселя на мониторе.
OffTopic:
Всавляйте код в теги - над окном, когда пишите сообщение кнопка с логотипом AutoIt
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
dwm18, ra4o

PixelSearch возвращает координаты первого найденного пикселя. При следующем вызове нет гарантий, что это будет тот же пиксель. Вам нужно после каждого вызова PixelSearch сверять координаты.

Другой вариант, найти пиксель и мониторить его цвет через PixelGetColor.
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
ra4o сказал(а):
А как точно вычислить время 1-го цикла тогда ?
Вот так можно :
Код:
$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
;В этом месте - тот участок кода , время работы которого хотите проверить
;........................................................................
;........................................................................
$iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
ConsoleWrite($iDiff&@CR);Покажет время выполнения участка кода в консоли

а то повторная проверка и циклы срабатывают на моргание
Как оно моргает ? Цвет появился и сразу пропал или , моргает постоянно с какой-то частотой, как считать , что он перестал моргать (сколько по времени он должен быть постоянно) ? Попробуйте во втором варианте изменить (увеличить) количество циклов, в течении которых цвет не должен пропадать...

А в какие места кода - что куда расставить - я начинающий, чтобы посчитать прохождение 1-го цикла ?

Код:
PixelExist = False
While 1
    PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 3) ; координаты области, цвет, допущение оттенка, шаг поиска
    If Not @error Then
        $PixelExist = True
        For $i = 0 To 19 ;Количество циклов, за которое точка не должна потухнуть
            PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 3)
            If @error Then
                $PixelExist = False
                ExitLoop
            EndIf
            Next
        If $PixelExist Then
            SoundPlay("C:\0\zvuk.mp3", 0)
	    $PixelExist = False
            Sleep (300000)
        EndIf
    EndIf
  WEnd





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

InnI сказал(а):
dwm18, ra4o

PixelSearch возвращает координаты первого найденного пикселя. При следующем вызове нет гарантий, что это будет тот же пиксель. Вам нужно после каждого вызова PixelSearch сверять координаты.

Другой вариант, найти пиксель и мониторить его цвет через PixelGetColor.

пиксель появляется - точно по оси Х на 2211 координате, и по оси Y - все нормально
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
InnI, я оставлял функцию "PixelSearch" намеренно , так , как она допускает некоторую степень изменения цвета и не так жестко контролирует область нахождения пикселя, предполагая , что так и нужно автору, хотя с учётом Ваших замечаний скрипт может выглядеть так :
Код:
PixelExist = False
While 1
	$coord = PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 3) ; координаты области, цвет, допущение оттенка, шаг поиска
	If Not @error Then
		$Color = PixelGetColor($coord[0], $coord[1])
		$PixelExist = True
		For $i = 0 To 19 ;Количество циклов, за которое точка не должна потухнуть
			$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
			If $Color <> PixelGetColor($coord[0], $coord[1]) Then
				$PixelExist = False
				ExitLoop
			EndIf
			Sleep(100) ;Небольшая пауза
			$iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
			ConsoleWrite($iDiff & @CR) ;Покажет время выполнения одного прохода цикла в консоли
		Next
		If $PixelExist Then
			SoundPlay("C:\0\zvuk.mp3", 0)
			$PixelExist = False
			Sleep(300000)
		EndIf
	EndIf
Sleep(100); Пауза между попытками поиска пикселя нужного цвета
WEnd
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
ra4o сказал(а):
InnI, я оставлял функцию "PixelSearch" намеренно , так , как она допускает некоторую степень изменения цвета и не так жестко контролирует область нахождения пикселя, предполагая , что так и нужно автору, хотя с учётом Ваших замечаний скрипт может выглядеть так :
Код:
PixelExist = False
While 1
	$coord = PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 3) ; координаты области, цвет, допущение оттенка, шаг поиска
	If Not @error Then
		$Color = PixelGetColor($coord[0], $coord[1])
		$PixelExist = True
		For $i = 0 To 19 ;Количество циклов, за которое точка не должна потухнуть
			$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
			If $Color <> PixelGetColor($coord[0], $coord[1]) Then
				$PixelExist = False
				ExitLoop
			EndIf
			Sleep(100) ;Небольшая пауза
			$iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
			ConsoleWrite($iDiff & @CR) ;Покажет время выполнения одного прохода цикла в консоли
		Next
		If $PixelExist Then
			SoundPlay("C:\0\zvuk.mp3", 0)
			$PixelExist = False
			Sleep(300000)
		EndIf
	EndIf
Sleep(100); Пауза между попытками поиска пикселя нужного цвета
WEnd

Ошибку выдает, файл прикрепил
 

Вложения

  • Ошибка скрипта.jpg
    Ошибка скрипта.jpg
    23.5 КБ · Просмотры: 4

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
dwm18 [?]
В первой строке пропущен $
Код:
$PixelExist = False



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

ra4o [?]
не так жестко контролирует область нахождения пикселя
Так я об этом и говорю. При первом вызове горит один пиксель, при втором этот же, а при третьем - другой. Естественно, dwm18 считает это миганием, а скрипт - нет.
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
InnI сказал(а):
dwm18 [?]
В первой строке пропущен $
Код:
$PixelExist = False



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

ra4o [?]
не так жестко контролирует область нахождения пикселя
Так я об этом и говорю. При первом вызове горит один пиксель, при втором этот же, а при третьем - другой. Естественно, dwm18 считает это миганием, а скрипт - нет.



Да один и тот же цвет не меняется !!! - вот и считаю так. координаты одни.....

спасибо за исправление ошибки


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

ra4o сказал(а):
InnI, я оставлял функцию "PixelSearch" намеренно , так , как она допускает некоторую степень изменения цвета и не так жестко контролирует область нахождения пикселя, предполагая , что так и нужно автору, хотя с учётом Ваших замечаний скрипт может выглядеть так :
Код:
PixelExist = False
While 1
	$coord = PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 3) ; координаты области, цвет, допущение оттенка, шаг поиска
	If Not @error Then
		$Color = PixelGetColor($coord[0], $coord[1])
		$PixelExist = True
		For $i = 0 To 19 ;Количество циклов, за которое точка не должна потухнуть
			$hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
			If $Color <> PixelGetColor($coord[0], $coord[1]) Then
				$PixelExist = False
				ExitLoop
			EndIf
			Sleep(100) ;Небольшая пауза
			$iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
			ConsoleWrite($iDiff & @CR) ;Покажет время выполнения одного прохода цикла в консоли
		Next
		If $PixelExist Then
			SoundPlay("C:\0\zvuk.mp3", 0)
			$PixelExist = False
			Sleep(300000)
		EndIf
	EndIf
Sleep(100); Пауза между попытками поиска пикселя нужного цвета
WEnd

Скрипт заработал, но не выдает консоль - времени прохождения 1-го цикла.

на цвет срабатывает - в неактивном окне ( изначальный первый скрит ) - короче все они работают с неактивными окнами.... Это так для сведения.....

Не выходит консоль :(
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
InnI сказал(а):
dwm18 [?]
Не выходит консоль
Запустите скрипт из SciTE (нажмите F5) - в нижней части редактора откроется панель.

Получилось - спасибо,

а можно в скрипт встроить, что бы в определенное время по системным часам выполнил действия ( нажатие мышкой по координатам ), и продолжил работу по поиску цвета.

Т.е. запустили - он ищет, ищет - цвет пикселя, время подошло, сделал несколько действий ( время заданное уже прошло ) и дальше мониторит - ждет цвет пикселя.

Можно встроить задание по времени ?

Код:
$PixelExist = False
While 1
    $coord = PixelSearch(2211, 111, 2211, 603, 0x008000, 50, 3) ; координаты области, цвет, допущение оттенка, шаг поиска
    If Not @error Then
        $Color = PixelGetColor($coord[0], $coord[1])
        $PixelExist = True
        For $i = 0 To 3 ;Количество циклов, за которое точка не должна потухнуть
            $hTimer = TimerInit() ; Запускает таймер и хранит дескриптор в переменной
            If $Color <> PixelGetColor($coord[0], $coord[1]) Then
                $PixelExist = False
                ExitLoop
            EndIf
            Sleep(100) ;Небольшая пауза
            $iDiff = TimerDiff($hTimer) ; Возвращает разницу во времени, от предыдущего запуска TimerInit, дескриптор которого указан в переменной
            ConsoleWrite($iDiff & @CR) ;Покажет время выполнения одного прохода цикла в консоли
        Next
        If $PixelExist Then
            SoundPlay("C:\0\zvuk.mp3", 0)
	     MouseClick("left", 1675, 445, 1, 0)
            $PixelExist = False
            Sleep(300000)
        EndIf
    EndIf
Sleep(100); Пауза между попытками поиска пикселя нужного цвета
WEnd
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
OffTopic:
dwm18
Если форум не посещают модераторы, то это не значит, что можно нарушать правила:
  • одна тема - один вопрос
  • код AutoIt должен быть заключён в соответствующие теги
И ещё на форуме работает поиск. Попробуйте решить свою проблему с его помощью. Тем более, что все проблемы уже давно решены. Не думайте, что вы первый ;)
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
InnI сказал(а):
OffTopic:
dwm18
Если форум не посещают модераторы, то это не значит, что можно нарушать правила:
  • одна тема - один вопрос
  • код AutoIt должен быть заключён в соответствующие теги
И ещё на форуме работает поиск. Попробуйте решить свою проблему с его помощью. Тем более, что все проблемы уже давно решены. Не думайте, что вы первый ;)

Да искал я - нашел

Код:
While Execute('(@HOUR & ":" & @MIN) <> 19:56')
    Sleep(1000)
WEnd

MsgBox(64, "Time Out!", @HOUR & ":" & @MIN)

Но это не то, возвращает бокс с текущем временем.....


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

InnI сказал(а):
OffTopic:
dwm18
Если форум не посещают модераторы, то это не значит, что можно нарушать правила:
  • одна тема - один вопрос
  • код AutoIt должен быть заключён в соответствующие теги
И ещё на форуме работает поиск. Попробуйте решить свою проблему с его помощью. Тем более, что все проблемы уже давно решены. Не думайте, что вы первый ;)

Хоть, подскажите в каком направлении искать, не ищется на форуме ( выполнение по времени, выполнение по часам, и т.п. )

Или новую тему создавать ?
 

ra4o

AutoIT Гуру
Сообщения
1,165
Репутация
246
Можно и так, только вместо паузы - ваш код по поиску пикселя, вместо "MsgBox" вызов функции с действиями по кликам и уберите из скрипта дикие паузы. Дальше вопросы в новой теме и код в теги вставляйте - проявите уважение к участникам форума, так ведь код читается проще.
 
Автор
dwm18

dwm18

Новичок
Сообщения
27
Репутация
0
ra4o сказал(а):
Можно и так, только вместо паузы - ваш код по поиску пикселя, вместо "MsgBox" вызов функции с действиями по кликам и уберите из скрипта дикие паузы. Дальше вопросы в новой теме и код в теги вставляйте - проявите уважение к участникам форума, так ведь код читается проще.

Вот новая тема http://autoit-script.ru/index.php?topic=26467.new#new
 
Верх