2017年1月20日,腾讯发布消息称将推出Q-Glass,除了一般VR眼镜的标配功能外,Q-Glass还能实现眨眼抢红包。听起来是不是很酷炫?上市时间可要在10年后。不过,2016年底支付宝首推AR实景红包,QQ也紧随其后,一场AR实景红包大战悄然打响。
作为最近两年比较热门的技术,VR技术悄然成为移动技术之后有一大竞相追逐的技术,目前市面上比较成熟和出名的VR开发商,诸如:Google VR,Oculus,HTC Vivi。而已Google VR最为成功并商业化。关于这个可以参考我之前的介绍Google VR实践
不过今天我要说的是VR在我们生活中的应用,并且是大家已经用过的,相信大家在2017年年底的时候,一定玩过支付宝/qq(AR虚拟现实)藏红包、找红包吧,想象一下,你可以把你的红包藏在世界各地的任意角落,让全世界的人通过扫描来找红包,是不是觉得很酷,那么要实现这种功能,怎么做呢?
相信大家都玩过AR红包,这里就不介绍如何玩了。
AR红包技术实现分析
其实AR红包综合了GIS(LBS)、图像识别与秒杀技术等技术:
藏红包
- 藏红包的地点,即地球坐标(经纬度),在藏红包时会记录下这个红包的经纬度。
- 藏红包的标识(图片),即藏红包现场拍的照片,在藏红包时,会存下这张图。
- 藏好红包后,将生成的红包数据打包到服务器
找红包
- 将你附近的红包展示出来,比如方圆2公里有哪些人藏了红包,并且把他们的坐标信息也在地图上展示出来,方便你前往找红包
- 当你抵达红包坐标附近(比如50米内)时,你就可以拿起手机,根据红包提供的模糊化图片线索,扫描物体(即藏红包的图片),当你扫描的图片和藏红包时拍的图片完全匹配时,找红包成功。
当就这两个功能来说,主要涉及到以下技术:
- 地理位置信息的处理:红包位置的展示(将你的位置以及附近藏的红包位置分别在地图上展示出来),近邻查询(根据你所在的经纬度,查找你附近的红包)
- 图片相似度识别:找红包的人拍的照片 与 藏红包时拍下的照片 进行比对,相似度达到一定程度时,表示红包被找到了。
- 秒杀特性:例如你在一处藏了一个红包,那么可能有很多人同时在抢(不过这个秒杀应该比不上双十一,因为是小范围秒杀)。
不过,这几个功能在PostgreSQL数据库中都可以高效的实现,是不是很棒?那么接下来我们来看看PostgreSQL如何处理这两项需求的吧,顺便看看性能如何?
PostGIS插件
在AR红包的业务中,地理位置信息的处理主要包括以下两个方面:
- 根据你的位置,搜索附近的红包。即KNN搜索(如 select * from table where loc <-> poc<1公里orderbyloc<?>poc<1公里orderbyloc<?>poc)
- 根据用户的位置,红包的位置,计算用户与红包的距离。而在这个模型中,有个最常见的外围插件–PostGIS
PostGIS在军工、科研、民用场景都非常的流行,包括我们常见的精细地表raster探测,天文研究、地图、路径规划等应用中都可以看到PostGIS的影子,本文只用到了PostGIS的一小部分功能:GIS数据类型、GIST索引、近邻查询。
来看一张PostGIS在实际应用的图解:
详细的用法和测试方法参考
更多文章和详细的PostGIS功能可以参考
《如何建立GIS测试环境 - 将openstreetmap的样本数据导入PostgreSQL PostGIS库》
图像近似度处理
在PostgreSQL的的生态圈中,有很多这样的插件来满足图片搜索的需求,同时也支持图像相似度值的计算
1,使用Haar wavelet算法的imgsmlr插件
https://github.com/postgrespro/imgsmlr
2,使用图片RGB点阵组成的数组来计算相似度的插件-smlar
《从相似度算法谈起 - Effective similarity search in PostgreSQL》
参考
《从相似度算法谈起 - Effective similarity search in PostgreSQL》
《PostgreSQL 在视频、图片去重,图像搜索业务中的应用》
https://github.com/postgrespro/imgsmlr
3,使用图片RGB点阵组成的数组转成tsvector来计算相似度的插件-RUM
RUM计算相似度时带上了位置信息,精确度更高。比如(0,1,2,3,4,5与0,0,2,3,4,5与5,1,4,2,3,0与2,3,4,5,0,1)。其中0,1,2,3,4,5是原始点阵的值,那么0,0,2,3,4,5可能是有一定误差的值(因为依旧是线性相关的),而2,3,4,5,0,1出现了角度偏差(可以通过技术手段比如rum,把数据拉成环状修正),可能是图片拍摄角度造成的。但是5,1,4,2,3,0可能就不是那个图像了。
参考:
《从难缠的模糊查询聊开 - PostgreSQL独门绝招之一 GIN , GiST , SP-GiST , RUM 索引原理与技术背景》
AR 藏红包如何计算图片匹配
我们在AR藏红包的业务中,只需要用到计算近似值的功能即可,以上两个插件都可以很好的满足。比如使用RGB点阵时,在应用程序端生成RGB点阵,发送给数据库,与存储在数据库中的点阵进行相似度计算即可。
藏红包时的图像数字化流程如下:
- 拍照,点阵RGB串成数组或转换为tsvector(带距离计算,相似度更加准确),将红包的位置信息、图片RGB点阵存储到数据库中
找红包,匹配图像时的流程如下:
- 拍照,生成点阵,提交给服务端,进行图像匹配,匹配方法参考前面的三种方法之一即可,当然也可以考虑更高效的方法,搞进PostgreSQL的插件里面来。
注意,如果从服务端提取点阵,在客户端比对,这种做法虽然节省了服务端开销,但是这种做法可能存在漏洞,客户端可以被HACK,直接匹配上。
秒杀
目前业务层面只支持近距离找红包,所以通常来说,抢一个红包的人群不会太多。并且我们肯定会对操作数量限制的做淘汰操作。那么如果有上亿人同时秒杀一个红包怎么做呢?PostgreSQL同样有独门秘技来支持秒杀。
参考:
《PostgreSQL 使用advisory lock或skip locked消除行锁冲突, 提高几十倍并发更新效率》
总结
随着AR的技术越来越流行,地理位置、图像、视频、声音等特殊数据类型的处理会越来越常见,数据库应该与时俱进,不能再仅仅存储和处理文本、数字这么简单的功能,其综合技术的发展将日新月异。
而另一方面,PostgreSQL的高扩展能力,为AR提供了坚实的技术基础,不仅能存,更能高效处理。