背景
某互联网公司产品经理提了个需求,要求app做到可以根据用户手机壳颜色来改变app主题颜色,最后产品经理和程序员打了起来。
最近这件事刷了屏,不知道这件事是不是网友故意调侃。自古以来程序员和产品经理似乎都是一对冤家,哈哈,扯远了。想想产品经理提的这个需求也挺奇葩的。这个根本没法实现嘛,气愤中。。
冷静下来,思考一下,这个需求到底能不能实现呢?我觉得可以考虑从下面这个方案入手。
方案
启动前置摄像头,根据拍摄到的用户眼睛中手机壳的倒影来检测手机壳的颜色。
可行性
要想检测用户眼睛中手机的倒影,那需要先分析一下前置摄像头的视力是多少。我们都知道正常人视力是1.0,对应的视角是1角分,当然也有好眼1.5或2.0,对应视角是0.7角分和0.5角分。
我用iPhone 6s距离5米通过后置摄像头拍摄视力表,大概可以勉强拍清1.2,1.2已经开始模糊,1.5已经变成了小黑点。iPhone6s的后置摄像头是1200万像素,而前置摄像头低于这个像素。我没有使用过手机的前置摄像头拍摄过视力表,但是可以通过像素数来大体推算一下
iPhone 6s 前置摄像头是500万像素,对应视力 500/1200 * 1.2 = 0.5 iPhone X 前摄摄像头是700万像素,对应视力 700/1200 * 1.2 = 0.7
凸面镜
凸面镜成像,属于光学规律。平行光线投射到凸面镜上,反射的光线将成为散开光线,如果顺着反射光线的相反方向延伸到凸面镜镜面的后面,可会聚并相交于一点,这一点就是凸面镜的主焦点(F)。
角膜可以看做是一个凸面镜,角膜的屈光度是43D (数据来自于《眼科学》),那么角膜的焦距是
1 ÷ 43 ≈ 0.0233米,即 2.33厘米,
如果一束平行光通过角膜反射产生倒影,那么倒影的虚像就在角膜后方的2.33厘米处。但是我们看手机,手机漫反射发出的光不是平行光,而是散射光,散射光通过角膜反射产生的倒影距离角膜光心比平行光要远。远多少呢。我们来计算一下。
假设我们看手机的距离是30厘米,这30厘米也是焦距,产生的屈光度是
1 ÷ 0.3 ≈ 3.3D
这个屈光度会抵消掉角膜的屈光度,那么倒影的焦距是
1 ÷ (43-3.3) ≈ 0.0252米,即2.52厘米
倒影的大小是多少呢。
手机壳基本都是套在手机上,正面看只能看到边框,假设手机壳的边框宽度是0.5厘米,根据相似三角形可以计算出,倒影中边框的宽度是
2.52 ÷ (2.52+30) * 0.5 ≈ 0.0775厘米
你是不是被绕晕了?没关系,你只需要知道0.0775厘米就是距离眼睛30厘米的手机壳边框在角膜中倒影的宽度就可以了。 手机前置摄像头要想辨认角膜中的手机壳,那么需要的视角是多少呢? 我们可以大体看做这是一个由0.0775厘米和30+2.52厘米作为两条直角边形成的直角三角形,这个最小的锐角就是视角,通过反三角函数计算得出视角是
arcsin(0.0775 ÷ 32.52) ≈ 0.1365445° 转成角分就是 8.193′
这个视角对应的视力是多少度呢 推算一下
- 视力1.0的视角是1′
- 视力0.1的视角是10′
- 视力2.0的视角是0.5′ 可以推算出,在视力1.0视角是1′的基础上
视角放大几倍就是视力数值除以几 视角缩小几倍就是视力数值乘以几
可以计算出8.19′的视角对应的视力数值是 1 ÷ 8.19 ≈ 0.12
手机前置摄像头的视力达到0.12就可以距离眼睛30厘米拍摄到用户眼睛中手机壳前边框宽度并成像为1像素。前面推算出前置摄像头视力为0.5以上,那么可以成像为4像素以上。
可以推断出现在流行的手机基本都可以通过前摄摄像头解析到用户角膜中的手机壳的倒影。这只是理论数据,实际当中可能会有下面几个影响因素:
- 光线太弱导致成像不清楚
- 摄像头像素达到了,但是解析能力太差,导致成像不清楚
- 最主要是,角膜并镜子,对光线的反射能力太差,导致倒影发虚
但是手机将图像数字化后,可以分析图像的颜色数值来精确判断,即使一点色差都可以察觉到,所以这个或许可以实现。主要还是看手机对图像的的捕捉和解析能力。
结论
通过分析,这个需求也并不是完全不可能实现,只是对技术以及硬件的要求都很高。
声明
本文为本人原创,数据分析计算过程中可能存在错误。如需转载请注明原文地址,谢谢~