|
|
  |
Разработка findcolor, findimage, Pure lua |
|
|
sutra |
5.4.2021, 13:49
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Из кода видно, что чем меньше матрица pic[0][0], тем быстрее будет поиск. НАМНОГО быстрее если лопатить большие зоны. В этом вся и фишка. Хотите скорость - надо напрячь мозги. Лень, ну тогда будет медленнее. Каждый выберет для себя компромисс сам.
Из твоего bmp-шника не совсем понятно как искать. Насколько уникальна картинка, можно искать по красному, можно по зелёному. СМЫСЛ в чём?? Чтобы увеличить скорость, надо понять уникальность картинки. И если например такого ярко красного пикселя нет нигде, кроме как в этой картинке, то можно искать тупо по одному пикселю, а ещё тупее - найти его колором.
Соврал, по одному не получится, а вот по ДВУМ - легко.
И повторюсь. Я могу искать не только значимые пиксели (скажем красные), но и фон. Например посередине от этих двух красных однозначно присутствует светлый пиксель (скажем RGB данного пикселя все значения не менее 100) или например бесцветный пиксель значения RGB отличаются друг от друга не более, чем на 30 единиц. Нет никаких ограничений для фантазии юзера.
Ещё раз повторюсь. Если мне например не нужна скорость, ничего я не делаю, лень ... никаких условий ... задал погрешность и всё. А при желании можно задавать сколь угодно сложно комбинированные условия поиска (по которым и будет создана матрица поиска).
|
|
|
|
DarkMaster |
5.4.2021, 13:58
|
          
Модератор UOPilot
Сообщений: 9.735
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29622
Пользователь №: 11.279

|
Цитата Луа и си сравнимы по скорости Есть у меня сомнения. В любом случае количество пикселей необходимых для проверки не меняется. Каким образом можно проверить не 189 пикселей, а 2 и понять, что это не наше изображение? Старый финд же как-то ищет. Оптимизации накрываются кстати медным тазом, если искать не одно изображение, а все. Никуда не денешься - проверять придется все. sutra, пожалуйста, прогони через свой алгоритм мои изображения. Девиэйшн можешь поставить минимальынй(но не нулевой) - оттенки идентичные. Какая скорость нахождения изображения fi_large внутри scr? accuaricy 10% - это важно, т.к. вместо 1- пикслей, ему нужно будет обработать не менее 189 на каждую возможную координату в пределах scr.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
sutra |
5.4.2021, 14:17
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Код --lua local path=[[A:\МММ]] -- Объявление + инициализация каталога сохранения файлов создаваемых скриптом local f=require[[Scripts\LUA\fun]] local p,w,h,l=loadimage([[A:\scr.bmp]]) local PIC=f.CreateFindArray({{[[A:\fi_large.bmp]],r=0,acc=90}},1920) local k,m local t1=os.clock() for i=1,10 do k,m=f.FindImage(p,l,0,0,1919,1079,PIC,1) end local t2=os.clock() deleteimage(p) deleteimage(p1) log(k) log(m[1][1],m[1][2]) -- 1874 1039 log(t2-t1) -- 0.109 сек
|
|
|
|
sutra |
5.4.2021, 14:51
|
      
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007

|
Понял, сорри, не то делал.
local PIC=f.CreateFindArray({{[[A:\fi_large.bmp]],r=0,R=254,fgr=true}},1920) -- 1,154 (10 итераций) всё кроме оранжа
--local PIC=f.CreateFindArray({{[[A:\fi_large.bmp]],r=0,fgr=true}},1920) -- 0.120 (10 итераций)
В любом случае быстрее выходит.
Так large отличается от того что на скрине. Там оранжевый кант в левом углу совсем другой.
|
|
|
|
cirus |
5.4.2021, 14:52
|

         
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26866
Пользователь №: 16.971
Возраст: 29

|
Цитата Брать с искомой картинки первый пиксель и искать его на скрине, если нашёлся, то уже искать саму картинку в этом месте. Если точность не 100%, то брать второй пиксель и снова искать и т. д. пока хватает точности. Для fi_large.bmp этот способ точно будет быстро искать. По сути сначала вызываем findcolor и уже потом используем findimage в найденных координатах. Это все будет работать пока ты не будешь искать картинок больше, чем есть на экране. Именно поэтому я и вбиваю 100 картинок, когда там она одна. Чтобы увидеть скорость без оптимизаций. Какая разница? Берём первый пиксель, даже если найдется несколько тысяч таких пикселей на скрине, проверить наличие картинок в этих местах вообще ничего не стоит по времени. Если конечно не искать белый цвет в блокноте. В любом случае не миллиард пикселей проверять. Да, при очень низкой точности искать тоже будет долго, но этого и не требуется. Может есть ещё какие-то варианты. Цитата В любом случае быстрее выходит. sutra, где в твоём поиске параметр точности поиска? Поиск при 100% точности в любом алгоритме будет искать быстро.
|
|
|
|
DarkMaster |
5.4.2021, 14:58
|
          
Модератор UOPilot
Сообщений: 9.735
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29622
Пользователь №: 11.279

|
Цитата Там оранжевый кант в левом углу совсем другой. Какой нафиг другой? Я копипастил о,О Цитата Какая разница? Огромная разница. Это очень сильно ускорит поиск в случае, когда нужно найти 1 изображение и пофигу где. Когда нужно найти все изображения или, скажем, просто в упорядоченном виде, то начинаются проблемы. Упорядоченность дает конечно не полный перебор, но не без развлечений. А если тебе надо найти 100 изображений, а там только одно, то как ты сможешь исключить позицию, где 188 пикселей подряд идут ошибочные, а потом все нужные? В итоге тот же полный перебор будет. Цитата В любом случае быстрее выходит.
Дай код а... можно в приват...
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|