开始工作了,留给自己写博客和看书的时间也变少了。
最近半年更新的比较少,但是这个系列还是需要有个完结,不想写的太多,因为说的在前面都已经说过了。
AR在一年前就实现了,但是一直没有写博客来提一下。
这个项目,中间耗时近一年,虽然并不是大部分时间都在做AR实现,但是还是耗费了许多的功夫,最后也终于实现了大致的功能和预期,达到了实时的AR效果。我的毕业论文也是描述了AR过程的实现和优化方法。
由于时间太久远,不太想描述具体的细节,而且前面讲的已经差不多了。
简单贴一下用到的算法和优化方式吧:
- 编程语言:
C++
- 使用的库和标准:
openCv
(图像识别和处理)、openGL
(3d渲染和绘制)和一些线性矩形的处理库和数学库 - 特征点识别和描述算法:SURF算法(
Speeded Up Robust Features
),描述出特征点群 - 特征点匹配:K为2的
KNN
算法,即最近邻匹配 - 特征点群追踪:金字塔
Lucas-Kanande
光流法作为点群的预测,FAST算法用于SURF算法特征之后的特征点群的追踪和定位,LK通过FAST
算法描述出的特征点群算出光流追踪特征点群的移动 - 单应性矩阵:单应性变换矩阵(
Homography
),openCv
- AR-3D模型绘制:
openGL
的渲染管线 - … 还有挺多的优化点的,不过一时间想不起来了,想到再补充吧。
这里就再随便贴点最后的效果。
效果
- 这整个视频画面是通过
openCv
拿到视频帧,然后用openGL
作为纹理绘制在一个面上的,当识别到图像特征点群,比对之后,首先确认是否匹配到特征图像
- 若匹配成功,通过
KNN
筛选出准确的匹配点群,并算出单应性矩阵,根据算出的位置旋转和远近矩阵,通过openGL
渲染出3D模型到这个纹理面上,这样就有了远近的效果。
- 光流金字塔追踪之前通过匹配到的点群算出的矩形框中的点群(加速),对筛选之后的特征点群进行移动跟踪,跟踪完成若剩下的能跟踪到的点群数量还能支持单应性矩阵的生成,则继续重复第二步。
最后帧率大概在15帧以上,效果看起来还是挺不错的。
总结
如此,AR过程完结,挺简单吧。现在看起来真的挺简单的,但是当时做起来是真的非常费劲,因为周围没有任何人做过类似的东西,大多数人都只是对AR的库进行过使用。
所以这些全部都只能靠我自己去寻找方法,比如特征点的识别描述,之前也是想了各种的描述算法——SIFT、SURF、ORB
等。最后选择了SURF
算法,发现根本不能实现帧同步,卡的像PPT
然后想到并不是每一帧都需要去描述整个视频图像,然后做了图像分块、光流追踪、FAST
算法算出简单特征点和SURF算法的尺度不变的特征点进行一一对应、只追踪特征点群描述出来的矩形区域等等等等。
看了上百篇相关的论文,查看了很多相关的博客。最后总算做了出来,没有半途而废。
这个东西有价值吗?没有,因为市面上任何一个商用库都比我流畅和易用。
但是它有意义吗?对我来说,有。
做没有价值但是有意义的事情,是一种浪漫,程序员的浪漫。
最后,感谢我本科做了那么多没价值但是有意义的事情,希望以后也能多做一些这样的事情。