Что нового

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

Сообщения
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

Продвинутый
Сообщения
159
Репутация
69
Автор
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

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

joiner

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

gunter123

Продвинутый
Сообщения
159
Репутация
69
Ну так почему бы не попробовать точно так же искать зеленый цвет, но с разными оттенками?
Код:
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

Продвинутый
Сообщения
159
Репутация
69
Просто функция 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

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

Вложения

  • socgain1.JPG
    socgain1.JPG
    111 КБ · Просмотры: 7
Верх