指纹扫描仪使用相机
使用相机或不使用指纹扫描仪,其可能性和成功率?,我遇到了一个名为FingerJetFX的开源SDK,它也为Android提供了可行性。
FingerJetFX OSE指纹特征提取器是独立于平台的,可以通过对make文件进行适当的更改来构build,并可以在包含或不包含操作系统的环境中运行,包括
- Linux的
- Android的
- 视窗
- Windows CE
- 各种RTOS
但是我不确定指纹扫描仪是否可行,我下载SDK和挖掘,但没有运气,甚至没有发现任何步骤来整合SDK,所以有以下几个问题:
我正在寻找build议和指导:
- 指纹扫描仪可以在Android使用相机或没有相机?
- 在
FingerJetFX
的帮助下,我能达到目标吗?- 如果第二个答案是肯定的,那么有人可以提供我任何步骤来整合SDK在Android?
你的build议是可观的。
基于Android Camera的解决scheme:
作为对这一确切问题进行重大研究的人员,我可以告诉您,使用任何当前Android设备上的股票相机来获取合适的模板图像(特征提取)是很困难的。 主要的衰弱问题是在手指的山脊和山谷之间实现显着的对比。 商业光学指纹扫描仪(你试图模仿)通常通过在棱镜中受挫的全内reflection实现必要的对比。
在这种情况下,来自与棱镜接触的脊的光被传输到CMOS传感器,而来自谷的光不被传输。 你根本无法可靠地从Android摄像头获得同样的结果,但这并不意味着在理想条件下你不能得到可用的东西。
我用商业光学指纹扫描仪(Futronics FS80)拍摄左侧图像,右侧用普通相机(15MP Cannon DSLR)拍摄。 裁剪后,翻转(与其他扫描仪的惯例相匹配),对比照相机图像,我们得到以下结果。
相机图像的低对比度是明显的。
但是软件能够准确地确定脊stream量。
我们最终find了一个相当匹配的细节(用红圈标记)。
这是坏消息。 采取这种types的手指尖closures镜头是困难的。 我用一个闪光灯的DSLR来实现这些结果。 另外大多数指纹匹配algorithm不是尺度不变的。 所以如果在随后的“扫描”中手指距离相机较远,则可能与原稿不匹配。
我用于可视化的软件包是出色的BSD许可SourceAFIS 。 没有企业“开源版本”/“付费版本”shenanigans虽然目前只移植到C#和Java(有限)。
非摄像机的解决scheme:
对于具有支持“USB主机模式”的硬件的可怕数量的设备,您可以编写自定义驱动程序 ,将指纹扫描器与Android集成在一起。 我会诚实的,因为这两个模型,我做了这是一个巨大的痛苦。 我通过使用wireshark在扫描器和一个有一个工作驱动程序的Linux机器之间嗅探USB数据包,然后根据嗅探命令编写一个Android驱动程序来完成。
交叉编译FingerJetFX
一旦你制定了一个图像采集解决scheme(这两个潜在的解决scheme都有其缺点),你可以开始担心在Android上运行FingerJetFX。 首先,您将使用他们的SDK编写一个独立的C ++程序,将图像转换为模板。 之后,你真的有两个select。
- 编译它到一个库中,并使用JNI来与它进行交互。
- 编译成一个可执行文件,让你的Android程序把它称为一个subprocess。
无论你是否需要NDK 。 我从来没有使用JNI,所以我会顺从别人 的智慧 ,如何最好的。 我总是倾向于select路线#2。 对于这个应用程序,我认为这是适当的,因为你只是真的调用本地代码做一件事,模板你的形象。 一旦你的本地程序运行并交叉编译,你可以使用这个问题的答案来打包你的android应用程序,并从你的Android代码中调用它。
有几个直接的障碍:
-
获得良好的指纹图像将是至关重要的。 根据他们的网站,fingerjet期待标准指纹图像 – 例如8位灰度(高对比度),扁平指纹图像。 如果您使用相机拍摄指纹图片,用户将需要有一个平坦的透明表面(玻璃),您可以将指纹弄平,以拍摄照片。 然后,您的应用程序将find图像中的指纹,将其转换为指纹可接受的格式。 像OpenCV这样的库可以帮助你做到这一点。
-
FingerJetFX OSE似乎没有提供jar头android支持 – 你将不得不编译android的库,并通过JNI / NDK使用它。
从那里,指纹应该为您提供可用于匹配的打印的紧凑表示。
这是可行的,但使用要求(需要用户有一个平坦的透明表面可用)可能是一个交易断路器…