Начну с ключей для каналов.
Ключи из строчных символов определяют нижнюю границу значений каналов пикселей для формирования шаблона.
Ключи из ПРОПИСНЫХ символов определяют верхнюю границу значений каналов.
Если верхняя граница не указана, она по умолчанию равна нижней.
То есть условие b=200 идентично условию b=200, B=200.
Для ключей, определяющих разность между каналами пикселей, большее значение по умолчанию равно 255.
То есть условия rg=200 и rg=200,RG=255 идентичны (канал RED должен быть больше канала GREEN не менее чем на 200 единиц).
Ключ fgr определяет какие пиксели, соответствующие условию, будут фоновыми, а какие искомыми.
Если ключ fgr определён и не имеет значения false ( if fgr==true ) - это значит, что пиксели соответствующие условию
будут являться искомыми и попадут в шаблон. Например: {{fgr=true, b=0, B=255}} Все пиксели картинки попадут в
шаблон, то есть будет проверяться каждый пиксель картинки функцией поиска. Почему? Да потому, что любой пиксель
удовлетворяет условию.
Если ключ fgr НЕ определён - это значит что пиксели соответствующие условию будут считаться фоновыми и НЕ попадут
в шаблон. Например при условии: {{b=0, B=255}} - шаблон будет пустым, так как ВСЕ пиксели картинки будут считаться фоновыми.
Пример: мы создали картинку закрасив в исходной все "ненужные, лишние" пиксели чёрным цветом RGB=(0,0,0) - они должны быть
фоном. Оставили скажем 5 пикселей красного цвета с RGB=(255,0,0) и 10 пикселей зелёного цвета с RGB=(0,255,0).
Условие формирования шаблона должно быть таким {{r=0,g=0}} , то есть, если пиксели имеют значения каналов RED И GREEN равными нулю,
они будут считаться фоновыми и не попадут в шаблон.
Предположим, что зелёных пикселей в образе НАМНОГО больше чем красных. И чтобы повысить скорость поиска мы хотим сначала
анализировать красные пиксели и только потом зелёные.
Варианты условий для такой задачи:
1) { {r=255,fgr=true}, {g=255,fgr=true} }
сначала в шаблон попадают красные пиксели, а потом зелёные пиксели - самый простой и логичный вариант,
чтобы не запутаться в условиях.
2) { {r=255,fgr=true}, {r=0,g=0} }
сначала в шаблон попадают красные пиксели, а потом ВСЕ пиксели у которых канал RED ИЛИ GREEN НЕ равен нулю,
то есть оставшиеся зелёные пиксели.
3) { {r=255,fgr=true}, {g=0} }
сначала в шаблон попадают красные пиксели, а потом ВСЕ пиксели у которых канал GREEN НЕ равен нулю,
то есть оставшиеся зелёные пиксели.
Во втором и третьем варианте на первый взгляд нарушена логика. НО, УСЛОВИЕ №2 не влияет на первое.
Если пиксель уже в шаблоне, следующие условия не могут его исключить из шаблона и не могут изменить его параметры.
Ключ dev - это допустимое плюс минус отклонение каналов RGB в абсолютных единицах.
Ключ acc - это допустимое плюс минус отклонение каналов RGB в процентах (относительные значения).
Эти два ключа формируют параметры для функции FindImage и не влияют на создание массива искомых пикселей в шаблоне картинки.
Они определяют допустимые отклонения каналов RGB пикселей образа, от каналов RGB соответствующих пикселей шаблона.
Почему они присутствуют в функции CreateFindArray ? Исключительно для уменьшения математики и увеличения скорости
поиска функцией FindImage.
Рассмотрим на конкретном примере. Допустим искомый пиксель шаблона имеет RGB=(100,200,50).
Задаём параметр отклонения каналов: dev=10.
Если на экране (образе) поиска, в требуемой позиции, находится пиксель с RGB от (90,190,40) до (110,210,60), то есть плюс минус 10
единиц от значений каналов пикселя шаблона, то такой пиксель считается приемлемым - поиск даст положительный результат.
Ключ acc ... Я уже пожалел, что сделал его в таком виде, то есть acc=90 - это допустимое отклонение каналов на 10% (100-90),
наверное лучше было задавать его как acc=10, но как сделал, так сделал. Хотя подправить - раз плюнуть.
Итак для рассматриваемого пикселя, при acc=90 на экране будут искаться пиксели с RGB от (90,180,45) до (110,220,55),
то есть плюс минус 10% для каждого канала.
Если одновременно заданы оба ключа: dev=10, acc=90
на экране будут искаться пиксели с RGB от (80,170,35) до (120,230,65), то есть плюс минус 10% и 10 единиц.
Резюме: чем больше dev и (или) чем меньше acc тем шире поиск (мягче).
Зачем нужен ключ acc, если можно однозначно задать любое отклонение ключом dev?
Дело в том, что пиксели картинок "плавают" по вполне определённым правилам. Условно, если пиксель был красным,
то он и будет красным, а не зелёным. А это значит, что каналы пикселей изменяются (плавают) пропорционально,
то есть по идее как раз и нужен параметр acc который и задаёт пропорции в процентах.
Тогда возникает резонный вопрос, а зачем тогда нужен dev?
Рассмотрим на конкретном примере, например мы ищем красный пиксель картинки, в шаблоне он имеет RGB=(200,0,0).
На экране нас устроит красный пиксель и с RGB=(255,0,0) и с RGB=(200,20,10).
Если мы зададим отклонение даже хоть в 40% (acc=60), каналы GREEN и BLUE пикселя шаблона не будут иметь
отклонения, так как нуль на что не умножай, останется нулём.
Поэтому ключ dev нужен для создания диапазона отклонений для каналов RGB с низкими значениями.
Поэтому повторяюсь, если нет 100% уверенности, что пиксель имеет значения каналов не менее чем 70-100 единиц, то
использование ключа dev обязательно. Как уже говорил вполне приемлемое сочетание два 2 к одному:
{dev=5,acc=90}; {dev=10,acc=80}; {dev=12,acc=76} и т.п.
Конечно можно было сделать, чтобы для каждого канала задавались свои параметры отклонений, но на практике это
вряд ли понадобится, а читаемость кода ухудшится, вследствие громоздкости параметров.
Поиск картинки по разности каналов я тоже не стал реализовывать, сильно уменьшает скорость, а на практике мне
по крайней мере такое не требовалось.
Ну и надо помнить, что границы объектов подвержены максимальным искажениям, поэтому пиксели границ нужно
исключать из шаблона поиска. Подразумеваются границы реальных картинок, а не изображения символов и т.п..
Либо при поиске FindImage использовать параметр похожести картинки sim, но он может сильно замедлить поиск,
особенно при больших зонах поиска, поэтому использовать его надо в крайнем случае, когда иначе картинка не ищется.