Что нового

Пиксельный контроль

TheChemicalBrothers

Новичок
Сообщения
2
Репутация
0
Подскажите как реализовать выполнение операции после появления на экране определённого изображения.
 

RALIN

Новичок
Сообщения
3
Репутация
1
Для выполнения операции, нужно сначала подробнее описать свой вопрос.....
Что за определенное изображение, Отдельное окно ? Кадр из .avi например ?
 

blazzed

Новичок
Сообщения
3
Репутация
0
Попробуй через PixelGetColor и PixelSearch

http://autoit-script.ru/autoit3_docs/functions/PixelGetColor.htm
http://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm

Код:
PixelSearch ( left, top, right, bottom, color [, shade-variation [, step [, hwnd]]] )
 

RALIN

Новичок
Сообщения
3
Репутация
1
Если это определённое изображение появляется на № количество времени, а потом пропадает. При этом оно появляется в определённом месте на экране(Подразумевается разрешение экрана, например 1280 на1024, а не окно какого то ПО например).
То можно так :
1.Сперва находим изображение, появилось или нет.
Для Этого алгоритм постоянного поиска, того участка экрана где появляется картинка :
1.1. Находим 1 стартовый цвет пикселя, который 100% есть в этом "Определенном изображение".
1.2 Затем берем цвета следующих, например 5 пикселей,по Оси X, от Первого стартового пикселя.
1.3 Затем берём цвета следующих, тоже 5 пикселей, по Оси Y , от Первого стартового пикселя.
2.Если все наши 11 пикселей совпали , с заданными, то это появилась наша определённая картинка, значит можем выполнять скрипт дальше.
П.С.
Под Заданными подразумевается то что, изначально мы записали все 11 цветов, пикселей, по которым мы идентифицируем нашу картинку.

Проше написать функцию, которая будет возвращать в переменную 1(появилось изображение) или 0(соответственно нет).
Выглядеть будет в коде примерно так :
Код:
Func DefinitionPictures(ByRef $StatusPictures)
   ConsoleWrite('ФУНКЦИЯ DefinitionPictures НАЧАЛА РАБОТУ, пошёл алгоритм поиска'&@CRLF)
   ;Наши 11 цветов, которые мы знаем заранее, чтобы увидить картинку, Для более точного совпадения , можно увеличивать 
   Local $PixelStart=Color
   Local $PixelStart1=Color
   Local $PixelStartX2=Color
   Local $PixelStartX3=Color
   Local $PixelStartX4=Color
   Local $PixelStartX5=Color
   Local $PixelStartY1=Color
   Local $PixelStartY2=Color
   Local $PixelStartY3=Color
   Local $PixelStartY4=Color
   Local $PixelStartY5=Color
   ;Переменная в которую будет записывать результаты поиска стартового пикселя, от сюда будем отталкиваться
   Local $PixelStartSearch
   ;Остальные переменные , в которые будут записывать x and y найденных наших следующих пикселей.
   Local $X1,$X2,$X3,$Y1,$Y2,$Y3 ; etc .....
   ;Размер квадрата в котором ищим
   Local $Left=0
   Local $Top=0
   Local $Right=360
   Local $Bottom=0
   Local $MaxHeight=480
   ;Начинаем цикл выйдем из него кода $i = 1 
   $i=0
   Do  ; Поиск с помощью PixelSearch нашего стартового пикселя тут $Start дескриптор окна в котором работаем.
	  $PixelStartSearch=PixelSearch($Left,$Top,$Right,$Bottom,$PixelStart,0,1,$Start) 
	  If Not @error Then
		 ConsoleWrite('$PixelStartSearch='&$PixelStartSearch[0]&','&$PixelStartSearch[1]&' PixelSearch вернул не ошибку'&@CRLF)
		 ;По скольку вернул не ошибку, значит находим цвет рядом стоящего пикселя и далее сравниваем с заданным.
		 $X1=PixelGetColor($PixelStartSearch[0]+1,$PixelStartSearch[1],$Start)
		 If $X1=$ColorDisclosureX1 Then
			ConsoleWrite('+1 по x от стартового, равен заданому '&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
			;Если и второй равен заданому то идём дальше, и так до конца.
			$X2=PixelGetColor($PixelStartSearch[0]+2,$PixelStartSearch[1],$Start)
			If $X2=$ColorDisclosureX2  Then
			   ConsoleWrite('+2 по x от стартового, равен заданому '&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
			   $X3=PixelGetColor($PixelStartSearch[0]+3,$PixelStartSearch[1],$Start)
			   If $X3=$ColorDisclosureX3 Then
				  ConsoleWrite('+3 по x от стартового, равен заданому '&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
				  $Y1=PixelGetColor($PixelStartSearch[0],$PixelStartSearch[1]+1,$Start)
				  If $Y1=$ColorDisclosureY1 Then
					 ConsoleWrite('+1 по y от стартового, равен заданому '&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
					 $Y2=PixelGetColor($PixelStartSearch[0],$PixelStartSearch[1]+2,$Start)
					 If $Y2=$ColorDisclosureY2 Then
						ConsoleWrite('+2 по y от стартового, равен заданому '&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
						$Y3=PixelGetColor($PixelStartSearch[0],$PixelStartSearch[1]+3,$Start)
						If $Y3=$ColorDisclosureY3 Then
						    ConsoleWrite('+3 по y от стартового, равен заданому Нашли кнопку, присваиваем значение переменной '&$CoordButtonDisclosure[0]&','&$CoordButtonDisclosure[1]&@CRLF)
						   $StatusPictures=1
						   ;Выходим из цикла потомучто всё нашли
						   $i=$i+1
						ElseIf $Y3<>$$PixelStarY3 Then
						   $Left = $PixelStartSearch[0] + 1
						   ConsoleWrite('$Y3<>$$PixelStarY3, RETURN IN $PixelStartSearch=PixelSearch'&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
						   EndIf
					 ElseIf $Y2<>$$PixelStarY2 Then
						$Left = $PixelStartSearch[0] + 1
						ConsoleWrite('$Y2<>$$PixelStarY2, RETURN IN $PixelStartSearch=PixelSearch'&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
						EndIf
				  ElseIf $Y1<>$$PixelStarY1 Then
					 $Left = $PixelStartSearch[0] + 1
					 ConsoleWrite('$Y1<>$$PixelStarY1, RETURN IN $PixelStartSearch=PixelSearch'&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
					 EndIf
			   ElseIf $X3<>$$PixelStarX3 Then
				  $Left = $PixelStartSearch[0] + 1
				  ConsoleWrite('$X3<>$$PixelStarX3, RETURN IN $PixelStartSearch=PixelSearch'&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
				  EndIf
			ElseIf $X2<>$$PixelStarX2 Then
			   $Left = $PixelStartSearch[0] + 1
			   ConsoleWrite('$X2<>$$PixelStarX2, RETURN IN $PixelStartSearch=PixelSearch'&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
			   EndIf
			   ;ИСКЛЮЧЕНИЕ НА ОШИБКИ, ЕСЛИ НЕ СВОПАЛИ ЦВЕТА , ТО МЫ УВЕЛИЧИВАЕ $LEFT ДЛЯ ЛДВИГА ПО СТРОКЕ ЛЕВЕЕ ДЛЯ ПОИСКА,
		 ElseIf $X1<>$$PixelStarX1 Then
			$Left = $PixelStartSearch[0] + 1
			ConsoleWrite('$X1 <> $$PixelStarX1, RETURN IN $PixelStartSearch=PixelSearch'&$PixelStartSearch[0]&','&$PixelStartSearch[1]&@CRLF)
			EndIf
		 
	  Else
		 ConsoleWrite('$PixelStartSearch='&$PixelStartSearch&' PixelSearch вернул Ошибку'&@CRLF)
		 ;Если PixelSearch Вернул ошибку, то на строке нет стартового пикселя 100% Значит нужн опереключится на новую строку.
		 $Top=$Top + 1
		 ConsoleWrite('$Top=$Top + 1 Переводим поиск на нову строку'&@CRLF)
		 $Bottom=$Bottom + 1
		 $Left=0
		 ConsoleWrite('$Left=0 Начинаем поиск с начала строки'&@CRLF)
		 Если просканили весь участок, и не нашли совпадений то выхходим из цикла
		 If $Top=$MaxHeight And $Bottom=$MaxHeight Then $i=$i+1
		 EndIf
    Until $i=1
	
EndFunc
;Далее запускаем функцию
DefinitionPictures(ByRef $StatusPictures)

If $StatusPictures = 1 Then
;Картинка Определилась, делаем то что надо
EndIf


Можно так, но есть особенности:
1. И просто САМОЕ ГЛАВНОЕ НУЖНО СПЕРВА РАЗОБРАТЬСЯ В АВТОИТЕ, чтобы понимать что происходит.
2.Не задавать для данного кода, большие участки для поиска, иначе будет тупить.
3. Я возможно где-то ошибся, так как сам до конца НЕ разбираюсь в АВТОИТЕ. :IL_AutoIt_1:
 
Верх