检查数据库中的指纹

时间:2012-07-10 06:33:57

标签: c++ python mysql c sqlite

我将指纹保存在字段“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)

3 个答案:

答案 0 :(得分:2)

使用指纹数据库有两种根本不同的方法。一个是验证通过其他方式知道的人的身份,一个是搜索身份未知的人。

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

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

答案 1 :(得分:1)

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

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

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

FingerDevice.identify_finger(gallary)

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

答案 2 :(得分:0)

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

我认为,zinkingTudor说的是,如果您了解how does that judgement process works(顺便说一句,通过minutiae比较),您可以开发一个在数据库中存储过程的相关数据(* minutiae,可能?)的方法,然后是获取相关值的方法 - 可能是数据库的一种索引或某种类型的扩展。

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

其他加速程序的解决方案

使用C:

我只知道足够的C来编写一些hello-world程序,但用纯C编写代码并不难用fp_identify_finger_img的{​​{1}}函数,我可以告诉你它是比libfprint快得多。

您可以继续在python中注册部分内容。我做到了。

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

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

我们知道pyfprint.identify_finger尝试使用您在列表中提供的指纹对象来识别循环中的手指,因此我们可以使用它并为其提供排序的对象,其中用户的可能性越大时间和位置将是列表中的第一个,依此类推。