Author Topic: Вопрос по функции IF_PICTURE_IN, PXLXOR.  (Read 7728 times)

0 Members and 1 Guest are viewing this topic.

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Вопрос по функции IF_PICTURE_IN, PXLXOR.
« on: January 06, 2013, 09:27:04 AM »
Здравствуйте, возможно ли анализировать область экрана быстрее чем функцией IF_PICTURE_IN ?
PXLXOR анализирует чётко заданную область, мне не подходит, пиктограммы у меня перемещаются.




MIG29

  • Освоившийся
  • **
  • Posts: 45
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #1 on: January 08, 2013, 10:15:11 AM »
-Есть функция PXL, для быстроты исп. ее, если позволяет.
-Есть функция if_pixel_in , (если найти такой цвет, который есть только на искомом обьекте)
-Можно максимально уменьшить область для поиска "if_picture_in". А также максимально уменьшить размер искомого изображения(вплоть до 2х точек).

Ну иии.. можно отказаться от корректирования цвета, если такое у вас прописано (хотя в новых версиях кликермэна есть возможность указать область корректирования, что серьезно увеличивает скорость).
Взамен можно уменьшить "качество цветопередачи", сглаживание в виндоусе, уменьшить качество в игре\браузере или где то там еще...

if_picture_in - зло

putman

  • Активный участник
  • ***
  • Posts: 199
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #2 on: January 09, 2013, 04:00:36 PM »
Буду уменьшать размер искомой области, 2х2 уж как то мало, хотя бы 4х4 сделаю и тогда точно из всего многообразия картинок не совпадёт ничего.

СлавьЯнИнъ

  • Активный участник
  • ***
  • Posts: 179
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #3 on: January 23, 2013, 01:48:55 PM »
Putman, насколько быстрее и для чего это нужно?
Например выйграешь ты 50мс и чего с этим будешь делать?
Какая периодичность анализа экрана у тебя, 1 раз в секунду или 10 раз в секунду?
добрый смех равняет всех

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #4 on: January 29, 2013, 04:57:23 PM »
Здравствуйте, возможно ли анализировать область экрана быстрее чем функцией IF_PICTURE_IN ?
PXLXOR анализирует чётко заданную область, мне не подходит, пиктограммы у меня перемещаются.
Хотелось тоже найти более быстрый метод. Cтало понятно, что PXL должна быть быстрее IF_PICTURE_IN, но вот на сколько? И как это применить в универсальном случае?
Представляя как работает IF_PICTURE_IN... вероятнее всего опбегает экран сравнивая первый пиксел, если первый совпал - сравнивает второй и т.д. Понятно, что чем больше картинка, тем дольше ищет. Ещё влияет грамотный подход к подготовке картинки. Логично, что лучше выбирать участок с уникальными цветами. Если на экране много похожих участков, обратить внимание на левую/верхнюю (верхнюю) часть выбираемого участка.
Ну можно с примером:
Весь экран море нужно найти лодочку (вариант космос и кораблик). Желательно чтоб в заготовленной картинке верхняя часть (в идеале верхняя и левая) начиналась прямо на кораблике без захвата моря.

Далее. Захотелось найти вариант замены IF_PICTURE_IN. Придумался вариант из IF_PIXEL_IN и вложенных сравнений PXL. Думаю 4-х проверяемых точек "неподряд" со смещением к уже найденным будет хорошей заменой IF_PICTURE_IN.
Особенно там, где приходится увеличивать размер искомой картинки. Тем более, что PXL вроде быстрее.
Решил сделать синтетический тест. Тест проводится с повторениями на специально подобранном поле для каждой искомой картинки.

Вариант с использованием IF_PIXEL_IN
Code: (clickermann) [Select]
#name "Тест на скорость картинка"
// Author: Vint
// Version: 2.0 (29.01.2013)


$cicle=30 // количество повторов
$picture="textures\pictest1.bmp"  // искомая картинка
$wait=10 // основная задержка
$h=0
$m=0
$s=0
$ms=0
$time_test=0      //9432357   2ч, 37мин, 12сек, 357 мс.

FOR ($i, $i<2)        // подготавливаем лог, отступ
   TFWRITE("Тест на скорость.txt", " ")
END_CYC
//GOTO(propusk)


$ms_start=$_ms


//==============================================================================
FOR ($i, $i<$cicle)
   GETSCREEN
   IF_PICTURE_IN (0,0, $_xmax,$_ymax, $picture)
      LOGWRITE("Найден в координатах X=", $_return1, ", Y=", $_return2)
      WAITMS($wait)
   ELSE
      LOGWRITE("Картинка не найдена")
      TFWRITE("Тест на скорость.txt","Картинка не найдена")
      HINTPOPUP("Картинка не найдена")
      HALT
   END_IF
END_CYC
//==============================================================================


$time_test=$_ms-$ms_start

propusk:
TFWRITE("Тест на скорость.txt", STRCONCAT(" Разрешение экрана   ",$_xmax+1,"x",$_ymax+1))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Картинка            ",$picture))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Количество повторов ",$cicle))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Задержка мс         ",$wait))
IF($time_test>999)
   $s=INT($time_test/1000)
   $ms=$time_test-$s*1000
   IF($s>59)
      $m=INT($s/60)
      $s=$s-$m*60
      IF($m>59)
         $h=INT($m/60)
         $m=$m-$h*60
      END_IF
   END_IF
ELSE
   $ms=$time_test
END_IF
TFWRITE("Тест на скорость.txt", STRCONCAT(" Время теста         ",$time_test,"  мс, или    ",$h," час. ",$m," мин. ",$s," сек. ",$ms," мс."))

HALT

Вариант с использованием IF_PIXEL_IN/PXL
Code: (clickermann) [Select]
#name "Тест на скорость пиксел"
// Author: Vint
// Version: 3.0 (29.01.2013)


$cicle=30 // количество повторов
$picture="textures\pictest2.bmp"  // искомая картинка
$wait=10 // основная задержка
$h=0
$m=0
$s=0
$ms=0
$time_test=0      //9432357   2ч, 37мин, 12сек, 357 мс.

FOR ($i, $i<2)        // подготавливаем лог, отступ
   TFWRITE("Тест на скорость.txt", " ")
END_CYC
//GOTO(propusk)


$ms_start=$_ms


//==============================================================================
FOR ($i, $i<$cicle) 
   GETSCREEN
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
      IF(PXL($_return1,$_return2+1)=16711680)
         IF(PXL($_return1,$_return2+1)=65280)
            IF(PXL($_return1,$_return2+1)=16711935)
               LOGWRITE("Найден в координатах X=", $_return1, ", Y=", $_return2)
               WAITMS($wait)
            END_IF
         END_IF
      END_IF
     
   ELSE
      LOGWRITE("Картинка не найдена")
      TFWRITE("Тест на скорость.txt","Картинка не найдена")
      HINTPOPUP("Картинка не найдена")
      HALT
   END_IF
END_CYC
//==============================================================================


$time_test=$_ms-$ms_start

propusk:
TFWRITE("Тест на скорость.txt", STRCONCAT(" Разрешение экрана   ",$_xmax+1,"x",$_ymax+1))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Картинка            ",$picture))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Количество повторов ",$cicle))
TFWRITE("Тест на скорость.txt", STRCONCAT(" Задержка мс         ",$wait))
IF($time_test>999)
   $s=INT($time_test/1000)
   $ms=$time_test-$s*1000
   IF($s>59)
      $m=INT($s/60)
      $s=$s-$m*60
      IF($m>59)
         $h=INT($m/60)
         $m=$m-$h*60
      END_IF
   END_IF
ELSE
   $ms=$time_test
END_IF
TFWRITE("Тест на скорость.txt", STRCONCAT(" Время теста         ",$time_test,"  мс, или    ",$h," час. ",$m," мин. ",$s," сек. ",$ms," мс."))

HALT



Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #5 on: January 29, 2013, 05:16:06 PM »
Выводы.
Перебор функцией трёх совпадающих пикселов вторым способом IF_PIXEL_IN/PXL в 2 раза быстрее IF_PICTURE_IN так же из 3-х совпадающих пикселов. Заметьте трёх!
Такие маленькие картинки редко используют. А увеличение размеров влечёт рост времени поиска. Использование процента совпадения повлечёт рост времени ещё больше.

В примере IF_PIXEL_IN/PXL применялось регулярное смещение в ряд. В реальных операциях смещение желательно подобрать нерегулярное как по X так и по Y. Это уменьшит вероятность промежуточных совпадений и обеспечит уникальность.

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

Впервые серьёзно задумался над данным вопросом после прочтения страждущего на этом форуме. Посмотрел приложение. Помните с хоккеем (сейчас уже не найду). Первая моя реакция была: фиг успеешь отследить, особенно на большой области экрана и тем более нескольких взаимнодвижущихся объектов с такой скоростью какая там была.
Так вот может пригодится?...   ;)


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #6 on: January 30, 2013, 07:48:30 AM »
Да я понимаю, что основная задержка при работе с экраном приходится на GETSCREEN, особенно при больших разрешениях. Было бы замечательно изменение этой команды введением дополнттельных параметров ограничивающих область, как это было сделано с COLORMODE. Конечно если такое возможно и если это целесообразно в плане увеличения скорости.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вопрос по функции IF_PICTURE_IN, PXLXOR.
« Reply #7 on: January 30, 2013, 08:21:58 AM »
Хех, выводы сделал, а результаты выложить забыл.
Code: [Select]
              шаблон 10 000 совпадений первого пикселя
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest1.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         7038  мс, или    0 час. 0 мин. 7 сек. 38 мс.
 
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest1.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         7015  мс, или    0 час. 0 мин. 7 сек. 15 мс.



              шаблон 100 000 совпадений первого пикселя
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest1.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         7475  мс, или    0 час. 0 мин. 7 сек. 475 мс.
 
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest1.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         7420  мс, или    0 час. 0 мин. 7 сек. 420 мс.



              шаблон 100 000 совпадений 3-х пикселей
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest1.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         7806  мс, или    0 час. 0 мин. 7 сек. 806 мс.
 
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest1.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         7521  мс, или    0 час. 0 мин. 7 сек. 521 мс.



              шаблон 100 000 совпадений 15-и пикселей

 Разрешение экрана   1280x1024
 Картинка            textures\pictest2.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         8467  мс, или    0 час. 0 мин. 8 сек. 467 мс.
 
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest2.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         8395  мс, или    0 час. 0 мин. 8 сек. 395 мс.

 

               шаблон 1 совпадение 15-и пикселей
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest2.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         8688  мс, или    0 час. 0 мин. 8 сек. 688 мс.
 
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest2.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         8578  мс, или    0 час. 0 мин. 8 сек. 578 мс.



              шаблон 100 000 совпадений 3 пиксела ф-я PXL()
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest2.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         4288  мс, или    0 час. 0 мин. 4 сек. 288 мс.
 
 
 Разрешение экрана   1280x1024
 Картинка            textures\pictest2.bmp
 Количество повторов 30
 Задержка мс         10
 Время теста         4366  мс, или    0 час. 0 мин. 4 сек. 366 мс.