使用相机的指纹扫描仪

时间:2013-01-07 07:54:17

标签: android sdk android-ndk camera fingerprint

使用相机或不使用相机的指纹扫描仪,它的可能性和成功率?,我遇到了一个名为FingerJetFX的开源SDK,它也提供了android的可行性。

FingerJetFX OSE指纹特征提取器与平台无关,可以构建 for,对make文件进行适当的更改,并在有或没有的环境中运行 操作系统,包括

  • 的Linux
  • 的Android
  • Windows CE
  • 各种RTOS

但我不确定指纹扫描仪是否可能,我下载SDK并挖掘但没有运气,甚至没有找到任何集成SDK的步骤,因此几个问题列出如下:

我正在寻找建议和指导:

  
      
  1. 指纹扫描仪可以在Android中使用相机或没有相机吗?
  2.   
  3. FingerJetFX的帮助下,我能实现目标吗?
  4.   
  5. 如果第二个答案是肯定的,那么有人可以为我提供任何一种在SDK中集成SDK的步骤吗?
  6.   

你的建议很明显。

2 个答案:

答案 0 :(得分:81)

基于Android相机的解决方案:

作为对这个确切问题做过重要研究的人,我可以告诉你,使用任何当前Android设备上的库存相机很难获得适合模板化(特征提取)的图像。主要的衰弱问题是在手指的脊和山谷之间实现显着的对比。商业光学指纹扫描仪(您试图模仿)通常通过棱镜中受抑制的全内反射来实现必要的对比度。

FTIR in Biometrics

在这种情况下,来自与棱镜接触的脊的光被传输到CMOS传感器,而来自谷的光则没有。您根本无法从Android相机中可靠地获得相同类型的结果,但这并不意味着您无法在理想条件下获得可用的内容。

我使用商用光学指纹扫描仪(Futronics FS80)在左侧拍摄图像,右侧使用普通相机(15MP Cannon DSLR)拍摄。在裁剪,反转(以匹配其他扫描仪的惯例),对比度等相机图像后,我们得到以下结果。

enter image description here

相机图像的低对比度很明显。

enter image description here

但该软件能够准确地确定脊流量。

enter image description here

我们最终找到了相当数量的匹配细节(用红色圆圈标记。)

这是坏消息。采取这些类型的手指尖的近距离拍摄是困难的。我使用带闪光灯的数码单反相机来实现这些效果。另外,大多数指纹匹配算法不是尺度不变的。因此,如果手指在随后的“扫描”中离相机更远,则可能与原始手指不匹配。

我用于可视化的软件包是优秀的BSD许可SourceAFIS。没有公司的“开源版本”/“付费版本”恶作剧,尽管它目前只移植到C#和Java(有限)。

非基于相机的解决方案:

对于具有支持“USB主机模式”的硬件的可怕少数设备,您可以write a custom driver将指纹扫描仪与Android集成。我会说实话,对于我这样做的两个模型,这是一个巨大的痛苦。我通过使用wireshark在扫描仪和具有工作驱动程序的Linux机箱之间嗅探USB数据包,然后根据嗅探命令编写Android驱动程序来完成它。

交叉编译FingerJetFX

一旦你找到了一个图像采集解决方案(两种潜在的解决方案都有它们的缺点),你就可以开始担心在Android上运行FingerJetFX了。首先,您将使用他们的SDK编写一个自包含的C ++程序,该程序将图像转换为模板。之后你真的有两个选择。

  1. 将其编译为库并使用JNI与其进行交互。
  2. 将其编译为可执行文件,让您的Android程序将其称为子进程。
  3. 要么你需要NDK。我从来没有使用过JNI所以我会按照the wisdomothers来了解我们的最佳状态。我总是倾向于选择路线#2。对于这个应用程序,我认为这是合适的,因为你只是真正调用本机代码做一件事,模拟你的图像。一旦你的本机程序运行并交叉编译,你可以use the answer to this question将它与你的Android应用程序打包并从你的Android代码中调用它。

答案 1 :(得分:3)

有一些直接的障碍:

  1. 获得良好的指纹图像至关重要。根据他们的网站,fingerjet期望标准指纹图像 - 例如8位灰度(高对比度),平坦的指纹图像。如果您使用相机拍摄指纹图片,则用户需要使用平坦的透明表面(玻璃),您可以将指纹弄平,以便拍摄照片。然后,您的应用会在图像中找到指纹,将其转换为fingerjet可接受的格式。像OpenCV这样的图书馆可以帮助你做到这一点。

  2. FingerJetFX OSE似乎不提供固定的Android支持 - 您必须为Android编译库并通过JNI / NDK使用它。

  3. 从那里开始,fingerjet应该为您提供可用于匹配的打印件的紧凑表示。

    这是可行的,但使用要求(用户需要平坦透明表面)可能是一个交易破坏者......