Что нового

Функция для поиска кнопок

Сообщения
21
Репутация
-1
Всем привет, недавно появилась задача сделать функцию для поиска любого объекта(в моем случае кнопки) на экране.
P.S. да, я не совсем тупой, искать приходилось именно по пикселям!

Логика следующая.
В функцию подается 4 параметра (colour_before,x,y,colour_after).
Цвет который ищем, как только его находим, берем координаты этого пикселя, смещаемся на заданные x,y и смотрим цвет уже в в новом месте, если цвет который мы взяли совпадает с colour_after, значит наша кнопка найдена , иначе уменьшаем границы pixel_search.

Вот реализация этой функции:
Код:
Func serchButton($color,$pix2x,$pix2y,$pix2color)
$y = 0
	while 1
			$pixel = PixelSearch(0,$y,1023,767,$color ,"","","Game_name") 
			If Not @error Then
					$var = PixelGetColor($pixel[0]+$pix2x, $pixel[1]+$pix2y, "Game_name")
					$var =  Hex($var, 6)
					if $var == $pix2color Then
						$return = '1|'&$pixel[0]+$pix2x&'|'&$pixel[1]+$pix2y
						 ExitLoop
					else
						$y = $pixel[1]+1
					endif
			else
				$return = '-1|0|0'
				 ExitLoop
			Endif
	WEnd
return $return
EndFunc


Проблема оказалась в том, что на разных ПК в одной и той же игре, с одинаковыми настройками графики, в одном и том же месте - немного разные оттенки.

Вопрос:

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

gunter123

Осваивающий
Сообщения
120
Репутация
46
Автор
T
Сообщения
21
Репутация
-1
gunter123 сказал(а):
shade-variation - Число от 0 до 255, показывающее, на сколько может отличаться красная, зелёная и синяя компоненты цвета. По умолчанию 0 (точное совпадение).
https://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm
Код:
$pixel = PixelSearch(0, $y, 1023, 767, $color, 100, Default, "Game_name") ; Заменить строку
Неужели было так сложно прочитать полностью и понять вопрос, а не давать глупый, пришедшей первым на ум, ответ?
 

gunter123

Осваивающий
Сообщения
120
Репутация
46
В чем проблема? Теперь оно будет искать указанный цвет и близкие к нему оттенки.
Проблема оказалась в том, что на разных ПК в одной и той же игре, с одинаковыми настройками графики, в одном и том же месте - немного разные оттенки.
 

joiner

Модератор
Локальный модератор
Сообщения
2 993
Репутация
501
the_gt99 [?]
Неужели было так сложно прочитать полностью и понять вопрос, а не давать глупый, пришедшей первым на ум, ответ?
[off title=OffTopic]неужели так сложно прочитать справку,чтобы не задавать глупых вопросов?[/off]
 
Автор
T
Сообщения
21
Репутация
-1
gunter123 сказал(а):
В чем проблема? Теперь оно будет искать указанный цвет и близкие к нему оттенки.
Проблема оказалась в том, что на разных ПК в одной и той же игре, с одинаковыми настройками графики, в одном и том же месте - немного разные оттенки.
Вот фото, на нем постарался подробно описать проблему.
 

gunter123

Осваивающий
Сообщения
120
Репутация
46
Ну так почему бы не попробовать точно так же искать зеленый цвет, но с разными оттенками?
Код:
Func serchButton($color,$pix2x,$pix2y,$pix2color)
$y = 0
   While True
            $pixel = PixelSearch(0,$y,1023,767,$color , 100,"","Game_name") 
            If Not @error Then
			   ; Ищем цвет с оттенком, близким к $pix2color в области 1х1 px 
               If PixelSearch(($pixel[0] + $pix2x), ($pixel[1] + $pix2y), ($pixel[0] + $pix2x), ($pixel[1] + $pix2y), $pix2color, 100, "", "Game_name")  Then
				  $return = '1|'&$pixel[0] + $pix2x&'|'&$pixel[1] + $pix2y
				  ExitLoop
			   Else
				  $y = $pixel[1]+1
			   Endif
            Else
               $return = '-1|0|0'
			   ExitLoop
            EndIf
    WEnd
Return $return
EndFunc
 
Автор
T
Сообщения
21
Репутация
-1
gunter123 сказал(а):
Ну так почему бы не попробовать точно так же искать зеленый цвет, но с разными оттенками?
Код:
Func serchButton($color,$pix2x,$pix2y,$pix2color)
$y = 0
   While True
            $pixel = PixelSearch(0,$y,1023,767,$color , 100,"","Game_name") 
            If Not @error Then
			   ; Ищем цвет с оттенком, близким к $pix2color в области 1х1 px 
               If PixelSearch(($pixel[0] + $pix2x), ($pixel[1] + $pix2y), ($pixel[0] + $pix2x), ($pixel[1] + $pix2y), $pix2color, 100, "", "Game_name")  Then
				  $return = '1|'&$pixel[0] + $pix2x&'|'&$pixel[1] + $pix2y
				  ExitLoop
			   Else
				  $y = $pixel[1]+1
			   Endif
            Else
               $return = '-1|0|0'
			   ExitLoop
            EndIf
    WEnd
Return $return
EndFunc
Просто я думал не изобретать велосипед, а просить помощи у старожил форума. Неужели нет более элегантного и простого решения?
P.S. еще не до конца разобрался в чем именно проблема, но представленная вами выше, функция не работает.
 

gunter123

Осваивающий
Сообщения
120
Репутация
46
Просто функция PixelSearch, в отличие от PixelGetColor, может искать по оттенкам цветов, поэтому это самое очевидное решение без использования дополнительных UDF. Если надо что-то более навороченное, можно посмотреть в сторону ImageSearch и подобных ей UDF
Можно еще таким способом:
Код:
#include <Color.au3>

Func serchButton($color,$pix2x,$pix2y,$pix2color)
$y = 0
    while 1
	  $pixel = PixelSearch(0,$y,1023,767,$color ,"","","Game_name")
	  If Not @error Then
		 $var = PixelGetColor($pixel[0]+$pix2x, $pixel[1]+$pix2y, "Game_name")
		 If Abs(_ColorGetGreen($var) - _ColorGetGreen($pix2color)) < 20 Then   ; $pix2color в числовом формате
			$return = '1|'&$pixel[0]+$pix2x&'|'&$pixel[1]+$pix2y
			ExitLoop
		 else
			$y = $pixel[1]+1
		 endif
	  else
		 $return = '-1|0|0'
		 ExitLoop
	  Endif
    WEnd
return $return
EndFunc
 
Автор
T
Сообщения
21
Репутация
-1
gunter123 сказал(а):
Просто функция PixelSearch, в отличие от PixelGetColor, может искать по оттенкам цветов, поэтому это самое очевидное решение без использования дополнительных UDF. Если надо что-то более навороченное, можно посмотреть в сторону ImageSearch и подобных ей UDF
Можно еще таким способом:
Код:
#include <Color.au3>

Func serchButton($color,$pix2x,$pix2y,$pix2color)
$y = 0
    while 1
	  $pixel = PixelSearch(0,$y,1023,767,$color ,"","","Game_name")
	  If Not @error Then
		 $var = PixelGetColor($pixel[0]+$pix2x, $pixel[1]+$pix2y, "Game_name")
		 If Abs(_ColorGetGreen($var) - _ColorGetGreen($pix2color)) < 20 Then   ; $pix2color в числовом формате
			$return = '1|'&$pixel[0]+$pix2x&'|'&$pixel[1]+$pix2y
			ExitLoop
		 else
			$y = $pixel[1]+1
		 endif
	  else
		 $return = '-1|0|0'
		 ExitLoop
	  Endif
    WEnd
return $return
EndFunc
Спасибо огромное за помощь. Для тех, кому эта тема может пригодится в будущем оставляю ссылку на ImageSearch
[hide]https://www.autoitscript.com/forum/topic/148005-imagesearch-usage-explanation/[/hide]
 

RuslanTigran

Чайник
Сообщения
7
Репутация
0
Можно с похожей проблемой обратиться ? Как проще найти сердечко лайка в инстаграме, оно прыгает вверх-вниз (в зависимости есть каменты/ нету) и влево-вправо (в зависимости от размера фото) но в целом всегда плюс минус в небольшой области находится
 

Вложения

Верх