Автор Тема: Функция для поиска кнопок  (Прочитано 914 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн the_gt99 [?]

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

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

Вот реализация этой функции:
Код: AutoIt [Выделить]
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


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

Вопрос:

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

Русское сообщество AutoIt

Функция для поиска кнопок
« Отправлен: Май 21, 2018, 02:11:03 »

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 120
  • Репутация: 46
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #1, Отправлен: Май 21, 2018, 09:14:03 »
Цитировать
shade-variation - Число от 0 до 255, показывающее, на сколько может отличаться красная, зелёная и синяя компоненты цвета. По умолчанию 0 (точное совпадение).
https://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm
Код: AutoIt [Выделить]
$pixel = PixelSearch(0, $y, 1023, 767, $color, 100, Default, "Game_name") ; Заменить строку

Is it future or is it past?

Оффлайн the_gt99 [?]

  • Сообщений: 21

  • Автор темы
  • Репутация: -1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #2, Отправлен: Май 21, 2018, 13:56:55 »
Цитировать
shade-variation - Число от 0 до 255, показывающее, на сколько может отличаться красная, зелёная и синяя компоненты цвета. По умолчанию 0 (точное совпадение).
https://autoit-script.ru/autoit3_docs/functions/PixelSearch.htm
Код: AutoIt [Выделить]
$pixel = PixelSearch(0, $y, 1023, 767, $color, 100, Default, "Game_name") ; Заменить строку


Неужели было так сложно прочитать полностью и понять вопрос, а не давать глупый, пришедшей первым на ум, ответ?

Русское сообщество AutoIt

Re: Функция для поиска кнопок
« Ответ #2 Отправлен: Май 21, 2018, 13:56:55 »

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 120
  • Репутация: 46
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #3, Отправлен: Май 21, 2018, 13:59:52 »
В чем проблема? Теперь оно будет искать указанный цвет и близкие к нему оттенки.
Цитировать
Проблема оказалась в том, что на разных ПК в одной и той же игре, с одинаковыми настройками графики, в одном и том же месте - немного разные оттенки.

Оффлайн joiner [?]

  • Расмус-бродяга
  • Модератор
  • *
  • Сообщений: 2963
  • Репутация: 495
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Функция для поиска кнопок
« Ответ #4, Отправлен: Май 21, 2018, 14:02:45 »
the_gt99  [?]
Цитировать
Неужели было так сложно прочитать полностью и понять вопрос, а не давать глупый, пришедшей первым на ум, ответ?
OffTopicнеужели так сложно прочитать справку,чтобы не задавать глупых вопросов?
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Русское сообщество AutoIt

Re: Функция для поиска кнопок
« Ответ #4 Отправлен: Май 21, 2018, 14:02:45 »

Оффлайн the_gt99 [?]

  • Сообщений: 21

  • Автор темы
  • Репутация: -1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #5, Отправлен: Май 21, 2018, 14:47:19 »
В чем проблема? Теперь оно будет искать указанный цвет и близкие к нему оттенки.
Цитировать
Проблема оказалась в том, что на разных ПК в одной и той же игре, с одинаковыми настройками графики, в одном и том же месте - немного разные оттенки.
Вот фото, на нем постарался подробно описать проблему.

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 120
  • Репутация: 46
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #6, Отправлен: Май 21, 2018, 14:54:18 »
Ну так почему бы не попробовать точно так же искать зеленый цвет, но с разными оттенками?
Код: AutoIt [Выделить]
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


Оффлайн the_gt99 [?]

  • Сообщений: 21

  • Автор темы
  • Репутация: -1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #7, Отправлен: Май 21, 2018, 15:03:31 »
Ну так почему бы не попробовать точно так же искать зеленый цвет, но с разными оттенками?
Код: AutoIt [Выделить]
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. еще не до конца разобрался в чем именно проблема, но представленная вами выше, функция не работает.

Русское сообщество AutoIt

Re: Функция для поиска кнопок
« Ответ #7 Отправлен: Май 21, 2018, 15:03:31 »

Помечен как лучший ответ пользователем the_gt99 Отправлен Май 21, 2018, 16:17:26

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 120
  • Репутация: 46
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #8, Отправлен: Май 21, 2018, 15:06:57 »
Просто функция PixelSearch, в отличие от PixelGetColor, может искать по оттенкам цветов, поэтому это самое очевидное решение без использования дополнительных UDF. Если надо что-то более навороченное, можно посмотреть в сторону ImageSearch и подобных ей UDF
Можно еще таким способом:
Код: AutoIt [Выделить]
#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
 

« Последнее редактирование: Май 21, 2018, 15:34:53 от gunter123 »

Оффлайн the_gt99 [?]

  • Сообщений: 21

  • Автор темы
  • Репутация: -1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #9, Отправлен: Май 21, 2018, 16:36:39 »
Просто функция PixelSearch, в отличие от PixelGetColor, может искать по оттенкам цветов, поэтому это самое очевидное решение без использования дополнительных UDF. Если надо что-то более навороченное, можно посмотреть в сторону ImageSearch и подобных ей UDF
Можно еще таким способом:
Код: AutoIt [Выделить]
#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
Скрытый текст:Войдите или Зарегистрируйтесь чтобы увидеть скрытый текст

Оффлайн RuslanTigran [?]

  • Новичок
  • *
  • Сообщений: 7
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Функция для поиска кнопок
« Ответ #10, Отправлен: Апрель 17, 2019, 18:51:34 »
Можно с похожей проблемой обратиться ? Как проще найти сердечко лайка в инстаграме, оно прыгает вверх-вниз (в зависимости есть каменты/ нету) и влево-вправо (в зависимости от размера фото) но в целом всегда плюс минус в небольшой области находится


Внимание: Для просмотра прикреплённых файлов необходимо Войти или Зарегистрироваться

Русское сообщество AutoIt

Re: Функция для поиска кнопок
« Ответ #10 Отправлен: Апрель 17, 2019, 18:51:34 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
12 Ответов
7811 Просмотров
Последний ответ Июль 22, 2012, 15:46:36
от nikitin.v
1 Ответов
15512 Просмотров
Последний ответ Декабрь 21, 2011, 15:29:18
от romleon
0 Ответов
2458 Просмотров
Последний ответ Январь 12, 2011, 18:37:46
от Yashied
1 Ответов
2690 Просмотров
Последний ответ Июль 30, 2011, 21:03:25
от Ranos1982
5 Ответов
2635 Просмотров
Последний ответ Сентябрь 17, 2011, 02:21:52
от eil
15 Ответов
8348 Просмотров
Последний ответ Январь 23, 2012, 00:40:15
от CreatoR
1 Ответов
3547 Просмотров
Последний ответ Декабрь 01, 2012, 06:07:32
от madmasles
7 Ответов
1932 Просмотров
Последний ответ Август 08, 2015, 16:37:43
от iamOmg
6 Ответов
2491 Просмотров
Последний ответ Декабрь 08, 2015, 13:12:33
от Yura
0 Ответов
340 Просмотров
Последний ответ Май 21, 2018, 14:48:55
от the_gt99