Приветствую!
Долго, но не вполне успешно пользуюсь этой dll-кой.
В моем проекте мне нужен поиск чуть-чуть различающихся картинок, приходится использовать ImageSearch.
Который почему-то в моем случае их находит при значении aVariation равным 85 и больше (при 84 и меньше он просто картинку не узнает). Картинка отличается от эталона на несколько пискелей чуть светлее или чуть темнее (сравнивал попиксельно в цикле).
Беда с ImageSearch в том, что он (с aVariation>=85) иногда неожиданно находит то, чего нет в самом неожиданном месте.
Другая беда, что иногда он не находит того, что вроде бы визуально очень похоже на эталон.
Ну и третья беда, это, конечно, производительность: то что у BmpSearch занимает 20мс, ImageSearch может искать (особенно если искать неудачно) до 3 секунд.
Это была предыстория.
Теперь что делать?
Собственно, 2 варианта:
либо доразобраться с ImageSearch, научиться с ним нормально работать, при необходимости дописать/оптимизировать его,
либо написать свой проект / найти альтернативу.
Я пока за первый вариант, благо исходники ImageSearch есть и очень неплохо документированы.
Поэтому, кое-что я вроде бы нарыл, кое в чем не разобрался, поэтому поделюсь тем что понял и спрошу тут, вдруг кто-то это все уже проделал и получил какой-нибудь результат?
1. в исходниках много написано о прозрачности. Мне кажется, это то, что мне нужно.
Правильно ли я понял, что если я в эталонном образце укажу какой-то цвет как прозрачный, то ImageSearch будет считать все пиксели этого цвета совпадающими с любым пикселем картинки, на которой ведется поиск?
В исходниках есть такая строчка:
Почему-то ни в одном мануале я не нашел внятного описания, как пользоваться этим параметром.
Т.е. условно говоря, у меня эталонная картинка в .bmp, я могу передавать параметр как "*Transимя_цвета имя_файла.bmp"? И это будет работать? Или будет работать только для .png и иконок? И что за имя_цвета?
Очень было бы интересно про это почитать, чтобы самому не тратить много часов на ковыряния.
2. Очень интересно узнать, какие алгоритмы используются в ImageSearch для четкого и нечеткого поиска? Есть где-нибудь описание?
Комментарии в исходниках подробнейшие, но вот про алгоритмы я там не нашел, а сам в этом (пока) не силен.
Судя по 2 вложенным for для четкого поиска, я так понял, используется простейший полный перебор вычислительной сложности O(|X||A|)?
Впрочем, существуют ли более быстрые алгоритмы для поиска с "прозрачностями"?
А нечеткий поиск это проверка цвета всех пикселей на попадание в пределы маленького кубика в RGB-пространстве? Т.е. если хотя бы 1 кубик выпадает, картинка найдена не будет?
Мне бы не помешала как раз другая функция: цвета почти всех пикселей идентичны, а вот несколько процентов пикселей отличается полностью. Как я понимаю, такого там нет?
Вот эту тему читал: http://autoit-script.ru/index.php?topic=24167.0
Писать туда не стал, создал отдельную тему.
Т.к. там - в основном как пользоваться, т.е. как вызывать и подключать ее к своим autoit-проектам, а меня autoit-часть в данном случае вообще не волнует, я ее у себя в проекте вызываю так:
Исходники я взял с гитхаба (если здесь можно оставить внешнюю ссылку): https://github.com/MyBotRun/Libraries
Долго, но не вполне успешно пользуюсь этой dll-кой.
В моем проекте мне нужен поиск чуть-чуть различающихся картинок, приходится использовать ImageSearch.
Который почему-то в моем случае их находит при значении aVariation равным 85 и больше (при 84 и меньше он просто картинку не узнает). Картинка отличается от эталона на несколько пискелей чуть светлее или чуть темнее (сравнивал попиксельно в цикле).
Беда с ImageSearch в том, что он (с aVariation>=85) иногда неожиданно находит то, чего нет в самом неожиданном месте.
Другая беда, что иногда он не находит того, что вроде бы визуально очень похоже на эталон.
Ну и третья беда, это, конечно, производительность: то что у BmpSearch занимает 20мс, ImageSearch может искать (особенно если искать неудачно) до 3 секунд.
Это была предыстория.
Теперь что делать?
Собственно, 2 варианта:
либо доразобраться с ImageSearch, научиться с ним нормально работать, при необходимости дописать/оптимизировать его,
либо написать свой проект / найти альтернативу.
Я пока за первый вариант, благо исходники ImageSearch есть и очень неплохо документированы.
Поэтому, кое-что я вроде бы нарыл, кое в чем не разобрался, поэтому поделюсь тем что понял и спрошу тут, вдруг кто-то это все уже проделал и получил какой-нибудь результат?
1. в исходниках много написано о прозрачности. Мне кажется, это то, что мне нужно.
Правильно ли я понял, что если я в эталонном образце укажу какой-то цвет как прозрачный, то ImageSearch будет считать все пиксели этого цвета совпадающими с любым пикселем картинки, на которой ведется поиск?
В исходниках есть такая строчка:
Код:
else if (!_strnicmp(cp, "Trans", 5))
Т.е. условно говоря, у меня эталонная картинка в .bmp, я могу передавать параметр как "*Transимя_цвета имя_файла.bmp"? И это будет работать? Или будет работать только для .png и иконок? И что за имя_цвета?
Код:
strlcpy(color_name, cp, sizeof(color_name));
2. Очень интересно узнать, какие алгоритмы используются в ImageSearch для четкого и нечеткого поиска? Есть где-нибудь описание?
Комментарии в исходниках подробнейшие, но вот про алгоритмы я там не нашел, а сам в этом (пока) не силен.
Судя по 2 вложенным for для четкого поиска, я так понял, используется простейший полный перебор вычислительной сложности O(|X||A|)?
Впрочем, существуют ли более быстрые алгоритмы для поиска с "прозрачностями"?
А нечеткий поиск это проверка цвета всех пикселей на попадание в пределы маленького кубика в RGB-пространстве? Т.е. если хотя бы 1 кубик выпадает, картинка найдена не будет?
Мне бы не помешала как раз другая функция: цвета почти всех пикселей идентичны, а вот несколько процентов пикселей отличается полностью. Как я понимаю, такого там нет?
Вот эту тему читал: http://autoit-script.ru/index.php?topic=24167.0
Писать туда не стал, создал отдельную тему.
Т.к. там - в основном как пользоваться, т.е. как вызывать и подключать ее к своим autoit-проектам, а меня autoit-часть в данном случае вообще не волнует, я ее у себя в проекте вызываю так:
Код:
Local $result = DllCall("ImageSearchDLL.dll", "str", "ImageSearch", "int", $iLeftScreen, "int", $iTopScreen, "int", $iRightScreen, "int", $iBottomScreen, "str", $findImage)
Исходники я взял с гитхаба (если здесь можно оставить внешнюю ссылку): https://github.com/MyBotRun/Libraries