3

我将指纹保存在“blob”字段中,然后想知道比较这些印象的唯一方法是否检索保存在数据库中的所有打印,然后使用函数“identify_finger”创建一个要检查的向量?您可以使用 SELECT 直接从数据库中检查吗?

我正在使用 libfprint。在此代码中,验证是在向量中完成的:

def test_identify():
    cur = DB.cursor()
    cur.execute('select id, fp from print')
    id = []
    gallary = []
    for row in cur.fetchall():
        data = pyfprint.pyf.fp_print_data_from_data(str(row['fp']))
        gallary.append(pyfprint.Fprint(data_ptr = data))
        id.append(row['id'])
    n, fp, img = FingerDevice.identify_finger(gallary)
4

3 回答 3

2

使用指纹数据库有两种根本不同的方式。一种是通过其他方式验证已知人的身份,一种是寻找身份不明的人。

一个简单的库,例如libfprint仅适用于第一种情况。由于您使用它来验证某人,您可以使用他们的身份从数据库中查找单行。也许您已经扫描了不止一根手指,或者您已经为每个手指存储了多次扫描,但仍然会返回少量的数据库 blob。

必须从头开始设计指纹搜索算法,以缩小搜索空间、快速比较、对结果进行排序和处理误报。就像谷歌搜索可能会找到与您正在寻找的内容完全无关的页面一样,指纹搜索也会如此。有些公司致力于解决这个问题。

于 2013-02-06T19:04:55.013 回答
1

另一种方法是拥有一个知道如何使用指纹图像并根据您要查找的内容进行选择的 mysql 插件。

我真的怀疑有这样的事情。

您还可以尝试并行化指纹比较,即 - 调用:

FingerDevice.identify_finger(gallary)

并行,在不同的核心/机器上

于 2012-07-10T06:42:10.803 回答
0

您不能使用 SELECT 直接从数据库中检查,因为每次扫描都是不同的,并且会产生不同的 blob。libfprint 努力比较不同的扫描并判断它们是否来自同一个人

我认为zinkingTudor的意思是,如果您了解该判断过程是如何工作的(顺便说一下,通过细节比较),您可以开发一种方法来存储该过程的相关数据(*细节,也许?)在数据库中,然后是获取相关值的方法——可能是一种索引或某种类型的数据库扩展。

换句话说,您将不得不以libfprint更复杂(和美观)的方式重新实现算法,而不是仅仅接受libfprint将扫描与循环中所有存储的指纹进行比较的方法。

其他加快程序速度的解决方案

使用 C:

我只知道足够的 C 来编写那种 hello-world 程序,但是用纯 C 编写代码来使用 的fp_identify_finger_img功能并不难libfprint,我可以告诉你它比pyfprint.identify_finger.

您可以继续在 python 中进行注册部分的工作。我做。

使用基于时间/位置的 SELECT:

如果您知道您的用户在某个时间比其他时间或某个地方比其他地方更有可能扫描他们的指纹(可能在某个时间到达工作并扫描他们的手指,或者离开或通过一个门进入建筑物,或其他),您可以收集数据(在每次扫描时)以测量概率并创建并行表来对用户进行排序,以确定他们在每个时间和位置到达的概率。

我们知道它会identify_finger尝试使用您在列表中提供的指纹对象在循环中识别手指,因此我们可以使用它并给它排序的对象,以使该时间更有可能的用户和该位置将是第一个在列表中等等。

于 2013-02-06T18:05:50.523 回答