智能手机摄像头里藏着这样的秘密——窥探读取背后的原理
摄像头由「光的传感器」组成
智能手机摄像头的真身,是一块排列着数千万个微小光传感器的芯片,这块芯片叫作图像传感器。光线穿过镜头进入机身,落在每一个传感器上,「这里亮」「这里暗」的信息随即被换算成数字。这一大堆数字的集合,就是照片的真相。
读取黑白图案时,摄像头关注的不是颜色,而是「明暗之差」。白色部分反射大量光线,数值因此变大;黑色部分吸收光线,数值因此变小。这明与暗的落差越清晰,读取的精度就越高。在昏暗的地方读不出来,正是因为这个落差变小了。
反过来说,把图案印在深色的纸上,或者用金色银色这类会反光的材质印刷时,读取都会变得吃力——明暗的落差被压缩,传感器难以分清哪里是白、哪里是黑。
对上焦点的机制——自动对焦的真身
把摄像头对准图案,焦点会在一瞬间对上。这要归功于「自动对焦」这项功能。多数手机采用名为「相位差自动对焦」的方式,从抵达传感器的光线的偏移程度,反推出焦点所在的距离。这与人眼靠左右两眼的视差判断远近,是同一个原理。
对上焦所需的时间,在一般的手机上约为 0.03 秒,比眨一次眼还快。不过,摄像头与图案的距离过近时(5 厘米以内),受镜头结构的限制,焦点便对不上了。反过来距离过远,图案拍得太小,细部就读不出来。10 至 30 厘米是恰到好处的距离。
顺带一提,让手保持稳定同样重要。焦点即使对上了,若在成像的那一瞬手抖了一下,图案的边缘也会拖出残影。把手肘靠在桌面或身体上,读取会顺畅许多。
解码软件破译「图案的含义」
摄像头拍下的图像,就那样看只是一张黑白照片。从这里开始,才轮到读取软件(解码器)出场。解码器首先要在图像中找出三个大的方形标记。这些标记叫作「定位图案」,是确定图案的位置与倾斜角度的线索。
找到标记之后,解码器把整个图案像棋盘的格子那样划分开来,逐格判断那里是白还是黑。白换算成「0」,黑换算成「1」,0 与 1 的排列便还原成文字或网址。这一连串处理,在手机内部用不了一秒就能完成。
三个标记只占据四个角当中的三个,剩下的那一角被刻意留空。正因为缺了一角,解码器才能立刻分辨出图案是正着、倒着,还是横躺着。
有污渍、有划痕也能读出来的理由
图案的一部分被弄脏或者划伤,有时依然读得出来。这要归功于「纠错」这套机制。图案里除了本来的数据,还一并嵌入了「备用的数据」,即使缺了一部分,也能从剩下的信息把原本的数据复原回来。
纠错分为 L、M、Q、H 四个等级,在最强的等级 H 下,整体缺损约 30% 仍然可以复原。不过,纠错设得越强,图案就变得越大、越复杂,这里存在一处取舍。想像名片那样小小地印刷时设弱一些,像户外看板那样容易脏污的地方则设强一些,这是通常的做法。
在昏暗处也能读取的巧思
在昏暗的室内或夜间也能读取 二维码,是因为相机会配合周围的明亮度自动调整摄入的光量。光少的场景里,它会设法摄入更多的光;过亮的场景里,则抑制摄入的量。即便如此,光仍不足时,图像会变暗,图案的明暗变得难以分辨,便容易读取失败。这时,调高屏幕亮度,或朝光照到码的方向稍微移动,便会改善。帮一帮相机的调整,是读取成功的捷径。
过近过远都读不出的原因
把智能手机离 二维码太近,反而可能读不出。这是因为相机能对焦的距离有限。太近则焦点对不上,图案会模糊。反之太远,则每一个单元格拍得太小,无法分辨明暗。读取不顺利时,把智能手机拉近或拉远来调整,正是因为相机在寻找它恰好能对焦的距离。找到恰当的距离,便能通向快速读取。
为什么比条形码读得更快
超市收银台使用的条形码,只在横向拥有信息,是一维的信息。而黑白的方形图案在纵、横两个方向都拥有信息,是「二维码」。同样的面积能收纳的信息量相差一个数量级:条形码最多约 20 个字符,二维码最多可收纳 7,089 个字符。
读取速度快的理由,在于那三个标记让它「从任何角度都能瞬间确定位置」。条形码要靠激光横向扫过去读取,因此必须对准角度。二维码则是用摄像头把整体一次拍下,所以斜着拍、倒过来拍,都照样读得出。