Что нового

Работа с пикселями. Можно ли ускорить выполнение циклов?

incrome

by Incrome
Сообщения
24
Репутация
0
Всем привет ;), кто читает эту тему, прошу помочь с решением моей проблемы.
Суть заключается в том, что я пытаюсь сканировать определённый участок на мониторе, при нахождении пикселя который мне нужен я вызываю автоматический клик мышки в заданном месте. :scratch:
Вот код:

Код:
HotKeySet("{ESC}", "OnAutoItExit")
HotKeySet("{Home}", "Scaner")

Func OnAutoItExit() 
Exit
EndFunc

Func Scaner()

	dim $iX = 675 ;max R
	dim $iY = 577 ;max D
	dim $iXo = -1
	dim $iYo = -1
	
	while 1
		
		;------------------------------------- Эта часть была написана исключительно для проверки работоспособности программы!
		MouseMove ( $iX, $iY , 1)
		;--------------------------------------
		
		$var = PixelGetColor($iX, $iY) ;Здесь у нас берется пиксель для сравнивания с цветами которые перечислены ниже!
		$cvet1 = 0xFFFFFF
		$cvet2 = 0x333333
		$cvet3 = 0x666666
		$cvet4 = 0x999999
		$cvet5 = 0x4C4C4C
				
				if $var = $cvet1 or $var = $cvet2 or $var = $cvet3 or $var = $cvet4 or $var = $cvet5 Then ;Само сравнивание
					MouseClick ("left" , 842, 459 , 1 , 1)
				EndIf
		
		if $iY = 564 Then ;механизм перебора координат
		$iX = $iX + $iXo
		$iY = 565
				Else
		$iY = $iY + $iYo
		EndIf
		
		if $iY = 564 Then
		$iYo = 1
		Elseif $iY = 577 Then
		$iYo = -1
		EndIf
		
		if $iX = 640 Then
		$iXo = 1
		Elseif $iX = 675 Then
		$iXo = -1
		EndIf
				
				
	WEnd
			

EndFunc

while 1
	sleep (100) ;отдел ожидания нажатия клавиши Home
	WEnd


И так вроде бы всё написано грамотно и вроде всё работает :beer:, но в блоке где я сделал проверку, где мышка гоняется за моим "сканером" можно увидеть что скорость перебора пикселей очень - очень мала, а мне нужно отслеживать мяч который движется очень быстро , вот и выходит у меня, что ничего не выходит! :'(

Вот обзор на собственно в чём я пытаюсь реализовать свой код :ok::
http://www.youtube.com/watch?v=qypc65vqVnE
Как видно на видео, я пытаюсь словить мячик в определённой области и нажать на кнопку ударить....

Ну и в заключении укажу суть проблемы:
Как же мне ускорить процесс перебора?
Или как переписать код что бы он работал?
Либо подскажите как это можно реализовать?

Фух, вроде всё :wacko:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: [Автоматизация] Пишу графический сканер, возникла проблема!

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

"[Автоматизация] Пишу графический сканер, возникла проблема!" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

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








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


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

incrome

by Incrome
Сообщения
24
Репутация
0
Ммм прошу прощения, за некорректное оформление темы, правила читал, но видимо понял не до конца. Всё исправил, так пойдет? :whistle:
 

Yuri

AutoIT Гуру
Сообщения
737
Репутация
282
Тут что-то не пойму в чем смысл.
Если $iY = 564, - тогда... И опять - если $iY = 564, - тогда ...
Код:
[b]if $iY = 564 [/b]Then ;механизм перебора координат
        $iX = $iX + $iXo
        $iY = 565
                Else
        $iY = $iY + $iYo
        EndIf
        
       [b] if $iY = 564[/b] Then
        $iYo = 1
        Elseif $iY = 577 Then
        $iYo = -1
        EndIf
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Думаю PixelSearch вполне справится с задачей, можно еще и с шагом 2-4 пикселя отслеживать участок.
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
Тут что-то не пойму в чем смысл.
Если $iY = 564, - тогда... И опять - если $iY = 564, - тогда ...
Ну смотри, у нас в 1 варианте Если Координата У(Горизонтальное сканирование) = 564(Максимальное значение сканируемого пикселя) тогда мы прибавляем -1 (Что даёт нам в сумме изменение положения сканируемого участка в лево и так до крайней точки по Х)

Во втором коде там у нас просчитывается перемещение по горизонтале в верх в низ и т.д. и аналогично по вертикале! Заменяется с -1 на 1 что и даёт нам передвижение сканирования клеток по кругу!


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

Думаю PixelSearch вполне справится с задачей, можно еще и с шагом 2-4 пикселя отслеживать участок.
2-4 :shok:
Можешь написать как это правильным синтаксисом мне написать?
 
Автор
I

incrome

by Incrome
Сообщения
24
Репутация
0
Ыть точно, что то я там замудрил, вот так всё работает отлично) :ok:

Код:
HotKeySet("{ESC}", "OnAutoItExit")
HotKeySet("{Home}", "Scaner")

Func OnAutoItExit() 
Exit
EndFunc

Func Scaner()

	while 1
	
	$pixel = PixelSearch ( 640, 565, 675, 577, 0xFFFFFF)
	if IsArray ($pixel) = true Then
	MouseClick ("left" , 842, 459 , 1 , 1)
	EndIf
	
	WEnd
			


;+565maxUp
;-675maxRight

;+640maxLeft
;-577maxDown

EndFunc

while 1
	sleep (100)
	WEnd

Всем спасибо!!!)
 
Верх