我有指纹读取器secugen,我已经能够通过扫描指纹来获取我的应用程序来控制指纹设备,并且已经能够将它们保存到mysql数据库中!

将指纹保存到数据库后,我现在想使用指纹搜索用户,而我无法使用新指纹搜索,因为指纹另存为blob / img。
所以我需要将指纹转换为唯一ID才能在数据库中搜索它?

我有9,000,000个用户的mysql数据库。现在,我可以使用用户的(用户名)获取任何用户信息

SELECT USERS FROM members WHERE username=username_var


但是现在我无法在查询中使用WHERE,因为我有指纹模板而不是(username),并且指纹每次都会更改,因此当(username)时,我无法在查询中使用指纹我在查询中使用WHERE

所有指纹SDK都具有功能,可以帮助我解决这些问题,但是它们并不是那么快,需要7分钟的搜索时间,这是很长的时间。

我不知道该怎么办以及如何做。希望你能理解我的问题

最佳答案

摘要

您的SDK可以提供一种方法,可以将从其传感器获取的指纹转换为使用正则表达式适合于宽松/近似模式匹配的字符串,或者转换为适合二进制匹配的固定大小的二进制位向量;或者您需要找到一个库来自己进行转换。所有其他情况虽然在理论上可行,但根本不实用。

您不能仅凭图像做任何事情。

在这种情况下,Secugen SDK仅允许访问图像(我想是出于诊断目的),并且它需要自己运行检查(并且您需要使用1:N套件; 1:1套件不会)做)。如果您仍然想继续这样做,我将在底部提供一个建议。没建议,请注意。



无聊的细节

指纹看起来彼此非常相似,无法进行标准图像搜索。更糟糕的是,来自同一个人的相同指纹在任何两个读数中都不会看起来相同。不同的压力,速度,方向,环境温度,传感器和皮肤湿度水平,将导致不同的图像。基本上,您只有在将指纹转换为“特征向量”之后才能执行任何操作。

取而代之的是功能(并且您的SDK应该具有这些功能)将指纹图像转换为特殊特征点(交叉点,螺纹等,称为细节)列表以及它们的相对位置和其他参数。发生这种情况的级别取决于所使用的SDK和库:有不止一种方法。以非常特殊的传感器为目标很有帮助,但是方法在其提供的内容上有所不同(例如,鲁棒性,指纹轻微旋转的不变性等)。有关示例以及对其他方法的引用,请参见this paper

一些工具包不允许这样做(不向用户提供特征向量),而仅提供比较两个指纹图像的方法,通常使用PCA对齐它们,然后进行直接细节匹配。这对于一些图像非常有效,但是run time for finding an image in a database can be ruinous如此之多,以至于存在用于该任务的专用硬件(谷歌“自动指纹识别系统”)。

一旦有了特征向量,就需要将其转换为SQL可存储对象,该对象可以是字符串或元组中的一系列列。如何执行此操作取决于向量的构造方式。该对象的性质将决定您将能够运行哪种搜索。此翻译可以in a number of ways完成,绝对不是您应该自己尝试的方法。

这也是因为即使对指纹进行矢量化处理后,您仍将没有精确匹配。甚至同一分钟内来自同一个人的两个指纹之间也没有差异。取而代之的是,您将有许多正匹配项和许多负匹配项,并且需要为这两者建立置信度阈值(“是他”,“不是他”,“不能说”)。以及确定是否可以容忍假阳性(“是,是他!”-但不是)和否定阴性(“不,不是他”-的确如此)。在门锁上,您不需要假阳性,但可以容忍假阴性(只需再次滑动手指即可)。在刑事调查中,您不能允许假阴性让罪魁祸首溜走,并且您可以接受十二个假阳性(稍后再检查其犯罪行为...),但不能接受一百个假阳性(您无法检出一个假阳性)。数百人,其中有些人没有任何不在场证明-您无法将所有人全部逮捕)。

对于大型数据库,您将始终必须进行第一遍,从而将搜索限制在那些具有合理不变特征匹配的指纹上(例如,“样本中75%到125%之间的绝对轮螺旋数)。”这对于减少元组的数量是必要的,然后您将需要进行进一步的非不变分析,这要昂贵得多,并且绝对不能使用标准MySQL函数来完成。

另一种方法是在coded string representation中转换指纹,以便可以使用主流数据库中可用的合理词典方法(例如正则表达式加上Levenshtein距离)进行搜索。您的SDK支持或不支持这种字符串转换;它涉及特征和光谱域中的一个或可能几个变换。该方法的可信赖度取决于可以在字符串中填充多少个功能(您拥有的签名越多,匹配就越需要精确,您需要的功能越多,字符串就越长)。

您也许可以使用一些外部库来进行编码并使用a suitable algorithm进行检查。

即使是简单的事情,例如“返回最接近的匹配项或定义是否完全匹配?”在很大程度上取决于在存储之前如何处理指纹。这就是为什么通常SDK会提供高级接口来匹配指纹,并且它们会自己承担繁重的工作。有时,这种繁重的工作根本无法翻译成数据库(或并非没有很大的困难);例如,如果“注册”实际上是对神经网络的训练,而不是将特征向量插入数据库中。

肮脏的骇客

您有900万用户(您是FBI的人?),并拥有获取900万指纹的权限。并且您拥有这个SDK。匹配900万张图像是不可能的。但是出于上述原因,您只能向SDK提出问题,“此图像是否在数据库中?”并获得三个名称的列表,其中包括“是的占99%,是的占92%,是的占90%”。

您也许可以这样做:基于真正宏观的东西,对图像进行非常高级别的,非常粗糙的装箱。我不知道,也许是脊细节。您必须通过检查图像来完成此操作; OpenCV可能会为您提供帮助。您将得到一个从1到N的数字,并且该数字将是不可靠的,例如2%的错误。

这里的关键是,您必须确保SDK永远不会说应该进入X块的指纹将与您绑定到Y块中的指纹匹配。

然后,您可以建立五十个数据库,每个数据库有五十个用户,并假设(而是希望)您的参数分布合理平坦,而不是陡峭的高斯分布。分析指纹时,您可以在SDK数据库目录中复制五十个数据库之一,该数据库与您拥有的指纹中的X值相对应,并且您将仅在其中存储具有相同X值的那些用户。由于不确定性,某些用户将位于两个数据库中,但是通过这种方式,您可以将问题减少50倍(也许是45倍)。

您仍然需要调用SDK匹配函数,因为您没有其他方法可以对传入指纹进行分类。但您也许可以将运行时间减少到可管理的比例。

关于mysql - 如何将指纹转换为唯一ID以用于在数据库中搜索?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37231480/

10-13 09:02