【问题标题】:Check a fingerprint in the database检查数据库中的指纹
【发布时间】:2012-07-09 14:34:03
【问题描述】:

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

【问题讨论】:

  • 我认为 print 的特征应该存储在表中,而不是 blob,这样您就可以编写查询来匹配记录中的这些特征,而不是逐行检索它们。
  • zinking,你可以发一个例子吗?我想检查数据库中是否已经存在指纹下的数字(选择)。我将数组向量传递给函数(libfprint.identify_finger),当表很大时会减慢扫描速度。

标签: c++ python mysql c sqlite


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

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

    FingerDevice.identify_finger(gallary)
    

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

    【讨论】:

    • 所以我做得很好,及时搜索会失去性能,我总是用所有数字数据库创建一个向量。
    • libfprint 的包装器:pyfprint in github
    【解决方案3】:

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

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

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

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

    使用 C:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2015-07-28
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      相关资源
      最近更新 更多