> Поближе к конкретике. Остановимся на двух видах узлов - > начало/конец линии и разветвление (точка, из которой > выходит три линии). > Есть абсолютные координаты со сканера в пикселях, например. > 1. Н, x1, y1 > 2. Н, x2, y2 > 3. Н, x3, y3 > 4. Р, x4, y4 > 5. Р, x5, y5 > 6. Н, x6, y6 > Н - тип "начало линии" > Р - тип "разветвление" > x и y - координаты в диапазоне 0-255 (байт) > Как уйти от абсолютизма, чтоб новые параметры не зависели > ни от сдвига отпечатка в любом направлении, ни от поворота, > ни от масштаба? Формулу/алгоритм пожалуйста.
Формулу не дам, т.к. перевод в поле напрвлений - это не тривиальная задача и имеет кучу всяких алгоритмов... Да и можно не только именно полем направлений это делать. Неважно, главное, что есть такие алгоритмы (если уж будешь дотошным - то найду тебе в гугле парочку).
Ив итоге у нас не просто координата, а вся как бы "предыстория" образования этой точки - мы видим как шла линия и что из этого получилось. Поэтому резкий перепад направления (в случае разветвления) находится очевидным образом. Какая разница как повернут или масштабирован палец? Мы всегда увидим резкий перепад (просто, что он есть). Просто что перепад есть - это же инвариантно!
Как инвариантно хранить:
0. Делаем двумерный массив из struct{int x,y}, где x и y - либо -1, либо 1, ну еще 0, наверное
1. Бежим по полю направлений (ну крестиком допустим, т.е. текущий пиксел + пиксел ниже + пиксел выше + пиксел справа + пиксел слева)
2. Находим первый резкий перепад
3. Заносим в нашу таблицу
0
0 0,0
---
4. Дальше находим второй перепад, допустим, он ниже и левее первого
5. Заносим в таблицу
0 1
0 (0,0) (1,-1)
1 (-1,1) (0,0)
---
И т.д.
Я не претендую на оптимальность данного хранения... главное можно так хранить. Ну вот эта таблица (30х30) и будет уникальным идентификатором, она будетоднозначнообразовываться, даже при любом масштабе и при любом сдвиге (а если еще тоже самое в полярных координатах сделать - то и при любом повороте) - ее мы и хэшируем...
Конечно, вероятность того, что попадуться 2 человека, для которых она одинаково сработает - большая, но опять таки, я не претендую на оптимальность данного алгоритма - это для примера.
> Как получить "хеш" из 30 значений, чтоб по двум этим > "хешам" можно было просчитать насколько эти отпечатки > отличаются друг от друга? Как по этому "хешу" найти из > десятка образцов тот, на который он более похож?
хэш - должен быть один и тот же для данного пальца (ну... еще на данном устройстве).
|