Автор Тема: Вариант для значительного ускорения поиска картинок (даже огромных).  (Прочитано 390 раз)

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

dramster

  • Герой форума
  • *****
  • Сообщений: 618
    • Просмотр профиля
 пришла сегодня в голову такая идейка. ведь как работает обычный ифпикчуреин - ищет первый пиксель, потом сравнивает второй, если совпадает то далее, если нет то с начала, ну короче все кому интересно примерно понимают. это дает возможность использовать процент совпадения (и игнорируемый цвет). но если процент совпадения 100%, то зачем столько лишних действий?

 принцип мысли - ищем первый пиксель искомой картинки и проверяем ранее проверенный PXLXOR этой картинки, если нет, то далее со следующим найденным первым пикселем.

 идея пришла, время и техники для тестов нет. вот, на своем калькуляторе испытал, результаты неплохие. если кому интересно, мог бы норм потестить, усовершенствовать и в либу всунуть.




разрешение искомой области 1366 х 768. на вин10 сложновато с его вездесущим сглаживанием.

где ищем:


что ищем (100х100 !!!):


как ищем:
Код: Clickermann
  1. GETSCREEN
  2. // 3497629 цвет первого пикселя
  3.  
  4. SCANPXL($ARR, 0,0, $_xmax,$_ymax, 3497629)
  5. print(ARRSIZE($ARR)/2, " возможных координат")
  6.  
  7.  
  8. $t = $_ms
  9. IF_PICTURE_IN (0,0, $_xmax,$_ymax, "1.bmp", -1, 100)
  10.   print("нашли по старинке в координатах ",$_return1," х ", $_return2)
  11. END_IF
  12. print("за ",$_ms - $t, " ms.")
  13. print(" ")
  14. waitms(500)
  15.  
  16.  
  17. $t = $_ms
  18. $size = ARRSIZE($ARR)
  19. FOR($i=0,$i<$size,2)
  20.   IF(PXLXOR($ARR[$i],$ARR[$i+1],$ARR[$i]+100,$ARR[$i+1]+100) = 16584102) //16584102 - ранее подсчитаная контр сумма
  21.      print("нашли по новинке в координатах ",$ARR[$i]," х ", $ARR[$i+1])
  22.      $i=$size
  23.   END_IF
  24. END_CYC
  25. print("за ",$_ms - $t, " ms.")
  26. print(" ")
  27.  
  28. halt
  29.  

результат:
Код: HTML
  1. 22:49:10 2 возможных координат
  2. 22:49:13 нашли по старинке в координатах 640 х 352
  3. 22:49:13 за 4251 ms.
  4. 22:49:13  
  5. 22:49:14 нашли по новинке в координатах 640 х 352
  6. 22:49:14 за 23 ms.
  7. 22:49:14  

в 180 раз быстрее!!!

естественно, что скорость будет зависеть от количества "первых пикселей" в искомой области.



kiril

  • Герой форума
  • *****
  • Сообщений: 943
    • Просмотр профиля
Использовал этот метод, для определения ников в играх и для сверхбыстрой оценки ставок и получения результатов идущих матчей с разных букмекерских сайтов, чтоб определить самый медленный и получая информацию с самого быстрого успевать делать 100% ставки. Да работает в десятки раз быстрее, но естественно только на 100% совпадении картинки, а оно на сайтах бывает не всегда, картинка то чуть сместится, то чуть изменится.
Сложилось впечатление, что сами функции хеширования картинок не надёжные по неизвестной причине  иногда даёт другой результат(обычно на чёрном фоне) и PXLCRC и PXLXOR мучал, первая надёжней. Хотя сейчас подумал, что ошибки могли возникать и при цветокоррекции.
Для скорости проще искать двух-четырёхпиксельную картинку в заданной области, чем сначала искать пиксель, а потом хешировать картинку в 1000 пикселей.
К примеру таких пикселей будет сотня, перед нужным, функция прекратит работу при первом не совпавшем и дальше пойдёт искать, а хешировать для проверки всё равно придётся 1000 пикселей сто раз.
Но у хеширования есть другое достоинство - картинки к скрипту прикладывать не нужно. ;)