一.概要
本文会详细的介绍如何改装苹果手机,使其具有虹膜识别的功能
二.目标、成果
使用苹果手机实现虹膜的注册、登录、匹配识别的功能,
在苹果4s可以进行真机验证、在苹果6s上的速度<0.05s
跳转到视频(如果产生疑惑可回来看解答)
三.改装简介
1. 硬件
a. 改装手机的摄像头,使摄像头可以实现红外拍摄
b. 改装闪光灯,改成红外灯
2. 软件
a. 获取摄像头拍摄的视频流
b. 对获取的图片进行虹膜特征的提取、识别
c. 实现各种用户交互
四.详细的步骤
好的,本文的大致思路已经理清楚,现在开始。
为了更加直观的给大家讲解,这里需要先介绍一下本次将要实现虹膜识别,下图就使用的虹膜识别的流程
那么我们的识别设备就可以简化为一个相机,如下图所示:
既然虹膜识别设备就是一个相机,那么用手机自带的摄像头可以实现吗?答案当然是不可以,如果可以的话,本文就没有意义了。
虹膜识别要求高质量虹膜图片,需要相机采集到非常丰富的虹膜图像纹理。可见光拍摄是无法采集到虹膜图像的,只有红外拍摄才可以,下面就是效果,一看便知
上图显示:
1. 可见光拍摄的照片,眼球是黑色的,无法看到纹理,即便的采用超高像素+近距离拍摄也不行,根本就没法提取虹膜纹理
2. 红外拍摄可以提取到丰富的虹膜纹理,(上图的中间那张是500W像素的,放大后就可以看到清晰的虹膜纹理)
那么问题来了,我们的手机是可以见光相机,无法进行红外拍摄,难道要就此打住?不!,下面看一下相机尽头的结构,看看是否可以突破。
我们发现,相机的镜头组中有一层镜片是 红外光阻止镜片,它原本的作用是阻止红外光进入相机照射到感光芯片上,这样相机的感光芯片上就只会接受到可见的光谱,少了红外线的干扰,成像的质量会提升很多。
这里做个补充:苹果4s上的 红外光阻止镜片 效果 比小米Note的好,我用两个手机同时拍一个打开的红外灯,苹果拍照片和肉眼一样(看不出来红外灯是开着、还是关着),小米的照片就会看出红外灯发出了红色的光(如果灯开着的话)。所以看一个红外灯是否工作可以用手机相机拍照试试。
回归正题,如果我们把这层镜片拆掉(红外光阻止镜片),是否相机就可以进行红外成像了能?我们看看成像芯片的资料。
我淘宝买的的红外灯的波长就是850的,上面的曲线显示,成像芯片对850波长的响应还是非常不错的,但可惜这不是苹果摄像头的资料,它的资料也不会找得到。于是把镁光、ov、索尼芯片个找十几个,找到芯片资料的这个图,惊喜发现了,几乎所有的芯片都对850的光谱有响应,只是有多有少罢了。所以初步的估计苹果的成像芯片很大的可能可以对850的红外光进行响应。
淘宝上还可以找到截止可见光通过红外光的帯通滤光片,这就再好不过了。实际发现即便是不加这种镜片也是可以红外成像的,因为成像芯片在850时,rgb三种感光器的响应都比较高的值,叠加后更高(我需要的是亮度图),并且我使用的就是850的补光灯,但是最好还是加上,加上后效果会好一些。
总结:摄像头理论上是可以改装的,至少有希望,虽然有几个地方不确定。
理论分析完毕,开始实际操作:拆!
拆解步骤:
第一步. 取出摄像头
第二步. 撬开闪光灯板
第三步. 分离镜头和sensor板
第四步. 拆除红外光阻止镜片
如上图所示,有点偏蓝色的那块玻璃就是我们要拆除的东西。这里的坑比较多,首先你需要慢慢的打磨四个角、四条边,然后尝试着把他翘起,这里有几个需要注意的地方:
1. 不能碰到旁边的任何原件,有的很容易掉(重新焊接上基本不可能),有的很容易碎。
2. 下面的塑料方框上是有走线的,所以必须保证不被划到。
3. 不能把玻璃给弄碎掉。
a. 碎掉的话很肯能会划伤成像芯片,如果碎掉就没希望了,因为很难保证拆除碎片的玻璃时不碰到其他的地方(sensor)。
b. 不能有玻璃碎片、残渣落在了上面时,因为你是没有办法清除碎片颗粒的,有的体积极小看不见,但是拍照后发现全是点点。
4. 如果有大块的东西掉到了sensor上,切记不能用嘴吹,你的唾液它来说有腐蚀性,并且不纯,所以干了之后会有程沉淀,如果拍照就会有一大块褐色斑停留在上面
5. 如果真的有东西在上面,最好用纯净水清洗,然后立刻弄干。
第五步.装回去
第六步:
把相机自带的闪光灯换成红外灯就比较简单了,大家自行补脑即可。
整体的流程是这样的:
我拆毁大概20~30个,如果你们有兴趣要尝试,请准备至少20个(因为你已经有了我的经验),当然不是所有的手机摄像头都可以拆,
因为红外阻止镜片的位置有多种:
1. 红外阻止镜片直接和成像芯片一体的 => 放弃
2. 红外阻止镜片在镜头组的内部 => 放弃
3. 红外阻止镜片在镜头组的顶层 => 放弃
4. 红外阻止镜片在镜头组的底部 => 可拆(没遇到过)
5. 苹果4s、三星Note、荣耀7i 这几款都可拆,其他的就不清楚了
注意事项:
1. 镜头sensor的分离、滤光片的拆除,这两个的难度最大,成功率极低,只要保证不激动、冷静、不骂脏话、多试几次就会成功
2. 如果发现拆坏了,就不要在插回去开机,会导致手机发烫、不能开机、严重的会手机报废
3. 确定没问题再装机,因为摄像头的排线不在最上面,相当于手机基本拆完了,才能拆摄像头,尽量减少次数。我的主板壳掉了,挂了一次,发现有东西掉了,后来又被焊可回去,险胜
4. 很多时候要把后壳装上,才能开机。好几次误以为挂了
5. 镜头是有自动变焦功能的,不能把它弄坏了,所以:所有以前拆开的触点还是要焊接回去,尽量不要使用胶水。如果没有对焦功能,采集到的图片全是模糊的,就失去了意义
大功告成!先看看效果
左边的图片,可以看到相机是能工作正常的,只是有点偏黄,自动对焦功能管用。可以很清晰的看到上面有一个黑色的点点,那就是落在sensor上的污染物,已经没救了,不过虹膜识别还是可以实现的。
右边的图片,是用6s拍的一张4s正在显示4s拍的6s的照片(4s是改装过的),同样可以看出颜色偏向红色的方向。细心的朋友可能已经注意到了,听筒的上面感觉有一个红色的灯,没错!那就是手机自带的红外灯(用来进行距离识别)。如果再加上可见光截止镜片的话就只能看到那个小灯,屏幕就是一片漆黑。
Ok!硬件准备完毕,至少勉强达到了虹膜识别的最低要求。
接下来进行软件的开发!
1. 安装xcode、opencv、sql…
PS:codex安装opencv超级方便,直接拖进去就可以,根本就不需要整什么包括目录、库目录、连接、dll之类的东西。页面跳转页很好写,直接拖拽即可。页面的跳转逻辑可视。很可视化。
2. 移植虹膜识别算法,xode它竟然支持c++,直接拷贝进去,失败!竟然是因为文本格式问题,改掉格式之后,只有很少的错误,随便改改就可以。
3. 开始写代码,结果发现一个叫code4app的网站,竟然会有如此神奇的网站,上面什么样的ios例子都有,并且几乎全部随便下载,可以说99.99%下载后绝对可用(因为下载好的工程基本不需要任何配置)。
4. 从来没有做什么东西如此顺畅,结果2个星期左右就写好了全部的东西(我是从0开始object-c的,主要是感谢牛逼的code4app),但是装虚拟的Mac同样花了2个星期,这就有点尴尬了(注意:必须配240G的固态,不然会卡爆的,经验告诉我必须这样,内存12G就够了,i5CPU即可,这样的话同时开VS2017、Xcode、Matlab、Ps都不会卡)。
五.真机测试
所有需要做的工作都已近完成。
接下来有两个视频(请看完再描述再点击)
1. 4S的视频,因为经过了改装所以可以进行真实的测试(识别人的虹膜),有活体识别功能(照片、视频、模型不能通过),但是速度特别慢(因为4S的CPU很慢)
2. 6s的视频,因为没有改装过摄像头(无法进行红外拍摄),所以我只能先把虹膜的活体识别功能去掉,用照片进行演示。这个视频主要的目的是给大家看看虹膜识别的速度,速度非常的快,0.03秒就可以完成一次识别,这要比很多手机的指纹速度快很多(比如R9广告语:“0.2秒,一瞬间解锁”,网上显示大多都比这个长(2017)),6s的单核速度基本已近逼近i3处理器(对我的算法来说)
3. 注意下面所列出的问题和回答:
为什么速度差那么多?=> 上面已近解释。
为什么照片也能识别?=> 上面已近解释。
6s识别超快是不是因为没有加活体识别?=>不是,活体识别消耗资源很少!……
手机上有多个人的虹膜信息速度会下降吗?=>不会,1个人和1000个人识别时间上基本不会有任何的区别,因为匹配、检索算法更快!)活体识别是怎么实现的?算法可以开源码?=>实在不好意思
0.03秒就可以完成一次识别指的是什么时间?=>从获取到一张有虹膜信息的图像数据流开始,到分析出结果(通过、失败)
视频的前半部分是6s的,后半部分是4s的