检查数据库中的指纹

Check a fingerprint in the database

本文关键字:指纹 数据库 检查      更新时间:2023-10-16

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

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

libfprint这样的简单库只适用于第一种情况。由于您使用它来验证某人,因此可以使用他们的身份从数据库中查找一行。也许您扫描了多个手指,或者每个手指存储了多个扫描,但仍然会返回少量数据库Blob。

指纹搜索算法必须从头开始设计,以缩小搜索空间,快速进行比较,并对结果进行排序和处理误报。就像谷歌搜索可能会出现与你想要的完全无关的页面一样,指纹搜索也会出现。有些公司将其全部存在都致力于解决这个问题。

另一种方法是使用mysql插件,该插件知道如何处理指纹图像并根据您想要的内容进行选择。

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

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

FingerDevice.identify_finger(gallary)

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

您不能使用SELECT直接从数据库进行检查,因为每次扫描都是不同的,并且会产生不同的斑点。libfprint进行了艰苦的工作,比较不同的扫描,判断它们是否来自同一个人

我认为,津金和都铎所说的是,如果你了解判断过程是如何运作的(顺便说一句,通过细节比较),你就可以开发一种将过程的相关数据(可能是*细节?)存储在数据库中的方法,然后开发一种获取相关值的方法——可能是一种索引或数据库的某种扩展。

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

加速程序的其他解决方案

使用C:

我只知道足够的C来编写hello world程序,但用纯C编写代码来使用libfprintfp_identify_finger_img函数并不难,我可以告诉你它比pyfprint.identify_finger快得多。

您可以继续在python中执行注册部分的操作。我做到了。

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

如果你知道你的用户在某个时间比其他时间扫描指纹的概率更大,或者在某个地方比其他地方扫描指纹的可能性更大(可能在某个时候上班并扫描手指,或者离开,或者从一个门或另一个门进入大楼),您可以收集数据(在每次扫描时)来测量概率,并创建并行表来根据用户到达每个时间和位置的概率对用户进行排序。

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