注释:
1、书名:Mastering OpenCV with Practical Computer Vision Projects
2、章节:Chapter 3:Marker-less Augmented Reality
3、书中源代码的最新更新可以参考网址:https://github.com/MasteringOpenCV/code
这是一个小主求学的小故事,简单说一下:从16年6月到17年6月,本人一直在研究书上的代码,没有功劳却有苦劳,所以在这里絮絮叨叨两三句。因为硬性要求,小主目标是实现DIY的AR平台,但是目前对项目尚有一大堆问题,困惑到现在,总结任重而道远。这里为一年的时间的劳苦功少总结一下学习汇报给自己。
这是对增强现实的简单认识了,基于无标记识别的增强现实实现流程,并不依托网络平台。要将这个增强现实的实现流程小主思路并不是特别清晰,因为只知皮表,不懂得摸骨的精髓。相信来查看这个的多数是有些了解的,那么这个作为科普来说了。
1,摄像机图片的采集,我们用opencv的库函数很方便调用:
VideoCapture capture(0); Mat capImg; capture>>capImg;
VideoCapture使我们采集摄像头的照片传给了capImg,从这里开始了。
2,图像的预处理比较少,会用到图像的灰度化处理,或者改变图像的尺寸大小。
cvtColor(Img,Img_gray,COLOR_BGR2GRAY); //把Img灰度化为Img_gray;
3,特征点检测,我们可以用到的有FAST算子,ORB算子,SIFT算子,SURF算子,等等。小主没有去实现过,按自己的理解来点说一二:
这个项目里面用到的是ORB算子,而ORB是基于FAST的改进,那么原理同出一辙,在一个Bresenham圆上的像素点,比较一周的16个像素的灰度值,从某点出发,如果有连续的9个点像素灰度值大于或小于圆心的灰度值,那么就把它作为检测出来的候选特征点保存,随着特征点的检测,我们便也确定了它的坐标(x,y);
4、特征点描述,同样的特征点描述算子也有很多,有配套的检测方法,也有单独的,那么如:BERIF描述符,ORB描述符,SIFT描述符,SURF描述符。描述符的理念是对特征点的增强,使点的范围扩展到一定区域,让更大的区域里的信息来表征这个单单又小小的特征点。
同样的跟项目相关,这里使用ORB描述符,而ORB再次基于BERIF描述符做出改进,那么来说吧。在特征点的周围选定一定的区域,采用以下五种方式的一种对区域内进行随机选择点对(x,y),这样比较如图中短线两端两点的灰度值大小,以x>y为1,x<y为0,比较得出一组由256位01二进制数组成的数值串。在计算机中以8位为一字节存储为32个十进制数表示某一个特征点。
如上图,我们可以看到对检测到的30个特征点进行ORB描述符计算,得到的每个特征点由32维向量表示。
5、特征点匹配
从书本上和网上查阅情况来看,匹配的数学依据有两种,1是蛮力匹配,2是快速近似最近邻算法(FLANN)匹配。而项目中使用的是(蛮力匹配吧),由特征点描述符和待测的图像的特征点描述符进行欧氏距离计算,(听同学跟我说用哪一种距离并没有多少区别,现在还没验证),进而判定检测出来的特征点匹配情况,距离小的为匹配点对。
匹配的效果并不好,小主对这种结果左右为难,食之无味,弃之可惜。没找到更好的来代替,由于SURF和SIFT有专利保护,也没有怎么参考。因为还是想实现整个过程为妙,改进的机会和时间总是有的。
6、匹配的优化
在学习过程中,查阅的FLANN算法对匹配点对的优化效果还是客观的,可是小主不知道这个算法在特征点匹配过程中起着什么作用。大致体会是一个聚类算法,把接近的描述符分到一组里面,不断分组如同二叉树一样,从上到下的进行索引,索引到子节点便是最近的吧?还有就是参数调试都是针对一个描述符集,感觉就是训练器一样把一组数据进行提前分类,但是如何做到排除不匹配某某两点。
这里给出项目里面的匹配优化结果,当然这里的优化还是用了RANSAC算法,对离群值进一步删除。
小主这里对它们望洋兴叹一番。基础矩阵的校正,这里是我的坎了,匹配优化的算法封装的很好,而数学算法模型又纯纯的数学,小主才疏学浅看着数学并没有联系到这些点呐,距离呐。
7、来接着说三维注册,这里小主分析里面的注册关键在于对摄像头参数的计算和匹配优化好的点对进行单应性矩阵的计算。有这两者,三维注册已经大致完成。在项目中,摄像头的参数是事先计算出来的,这个在opencv里面有棋盘模板的检测,是张正友标定方法。而单应性矩阵的计算在项目中是这样进行的,在优化后的匹配点对中挑选几个进行计算,在opencv中使用的是findHomography函数,两步走,一步直接计算得到单应性粗糙矩阵,二步对图像进行透视变换扭曲再次测得一个透视的单应性矩阵和上一步粗糙矩阵相乘得到精确的单应性矩阵。单应性矩阵可以让运算出一张图片在另一幅图上的位置,这也是空间坐标的确定。
8、其它的来说,便是一个虚实结合的过程,把建好的三维模型准确的显示出来。这个可以通过OpenGL来绘制模型,在小主没搞清前面的情况下,盲人摸象的过程中,了解到三维模型的绘制需要对三维建模软件导出来的模型文件要进行解析,解析出里面的顶点数据,面数据,法线数据等,之后依照OpenGL的状态机读入模型数据,便可以显示了。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
到此为止,小主把对增强现实的实现流程模糊的拨弄了一遍。而小主这里也要把自己的问题列出来,不论结果会怎样,这是我接下来的任务00、
1、FLANN算法对特征描述符如何聚类和快速近似最近邻检测;
2、RANSAC算法对匹配的特征点对的离群值删除又是一个什么机理;
3、项目的逻辑是清晰的,而小主是个菜鸟,一年前没学过C++,OpenCV,OpenGL这些东西,而现在也只是皮毛,看代码一年,总觉得对里面的参数一头雾水,简直不能自理,不能自理的最终结果是不能改动代码为自己所用。在解决完上面两个问题,那么小主下一个改动的地方应该是,把读入的一张图片调整为多组图片的读入,然后比照着多对多的匹配,如何建立好模板(每组图片的特征点和特征描述符),然后拿动态摄像头采集的图片信息和模板上的每组图片进行配对检测,这样时间上会不会很长呐?
真希望自己可以按照自己的意愿来实现一些想法,踩在AR的跳板上,做一些好玩的事情。可是小主对明天有忧患,最进两三年都是充满忧患。可是活着总有问题,活着总是解决问题的,这是小猪对生活的看法,小猪是热爱生活的一个人,缤纷的世界里,向往着猎奇与思无邪无所顾忌。
最新功能实现如图:
自己写过博客后,慢慢发现应该尊重别人的技术分享,所以以后写文章时,应该首先列出参考博文,以后注意。后几篇介绍了代码的逻辑部分,并且参考了大牛们的博文对里面用到的算法做了简述。
书中的代码加了中文注释,并整合到了一起,但是效果不佳。第二个直接添加了别人读取obj格式模型的代码,没有纹理。
http://download.csdn.net/download/u013094783/10026155?web=web