最近在准备考研,所以博客很久没有更新了,最近怎么说呢,也还行吧,就是很久没有好好的打过代码了。
每天就是背背单词做做高数,好像一下子又回到了学生时代,还挺怀念的。
好了,话不多说,直接讲图像追踪
首先可以看看我的上一篇博客(AR技术点(一)),了解一下AR的基本常识
复杂的我就不多说了,我就浅显地讲一下AR中的图像标定和跟踪方式的优化和设计
PS:由于手边没有配置opencv环境,所以这些配图我都只能表达个意思,不一定准确
好的,拿我最近在看的《老友记》来举个例子
假设我们要在下面的环境中(环境图像scene_Img),捕捉到那个Chandler后面的白色壁灯的图像并进行标识(这里假设我们有门牌号的图片grab_Img)
用opencv的话一般会经历下面的几个步骤
1. 扫描得到grab_Img的所有特征点信息并保存(因为需要抓取的图像是不会变的)
2. 扫描得到scene_Img的所有特征点信息并暂时保存
3. 通过选取一种匹配子算法得到两个特征点容器中的每个特征点的匹配率
4. 筛选出匹配率高的匹配子,根据其内部存储的特征点坐标,取出两者的优质匹配点
5. 处理这些匹配率高的匹配点
6. 重复2-5步骤
我们进行AR的话,就是在5之中插入自己需要的模型渲染和向量矩形生成的过程。
其中最耗时的步骤分别是2和4,我们知道步骤1只会执行一次,在AR的过程中这个时间损耗是完全可以忽略不记的,所以我们就需要考虑如何减少2和4步骤的时间损耗
2 步骤现在一般采用FAST算法或者SURF取出特征点,为了保持尺度不变和方向不变性,我们的AR过程一般都采用SURF算法(当然SIFT算法效果更好,但是消耗的时间更多,所以AR只能折中的选择SURF算法)
但是尽管如此,算法这个执行一次需要的时间也在50-100ms之间,而步骤四采用的匹配算法一般也会耗费相近的时间,所以如果你能接受你的AR过程只有10帧,你可以尽管直接使用这个方法
如何优化
首先,我们得明白一个问题,我们需要的东西是什么,是场景中的所有匹配点的信息吗?
当然不是,我们只需要那个灯周围的特征点就够了,所以我们为什么要每一帧都去扫描得到全景的所有特征点信息呢。
而且我们要明白一点,在AR需要的摄像头拍摄到的视频中,背景是基本上不变的,所以我们只需要处理运动部分的图像的特征点处理。
如何才能做到这点,我们就需要了解一下光流金字塔
什么是光流金字塔,大家可以点进这个超链接看看效果,就是在视频中,通过当前帧和上一帧的灰度变化,实时的检测到你给予的特征点群的移动(实时的意思是这样的一个过程只需要10ms以内),拿我们上面的图像来说,下一帧是这样的:
我们可以通过光流金字塔算法得到什么呢?
一个这样的这样的运动轨迹(只是示意图,点代表特征点,箭头代表特征点的移动):
由于在刚才的步骤二已经得到了所有的特征点信息,而且步骤五中我们已经得到了优质匹配点,所以我们可以假设自己前面的步骤都做的很完美,我们只需要做这样的工作就可以了
一、首先通过SURF方法获取到优质的匹配点,并且圈定其区域(点为场景中的特征图像的特征点),若有一定量的特征点符合标准,执行步骤二,若没有,则跳过几帧的视频(加快帧率)
二、在往后的7、8帧中,使用光流金字塔的方式,实时跟踪这个这个区域内的特征点的移动,实时的跟新光流金字塔的识别矩阵,然后实时的计算变换矩阵(这是什么?请看AR技术点一的博客),如果检测到少于一定量的特征点无法获取(这时变换矩阵就无法进行计算),则结束当前的跟踪,进行步骤一的特征点识别过程
三、将获取到的特征点和原图像的特征点进行实时对比,生成单应向矩阵,然后算出其大小、方向、三维空间下的旋转,生成变换矩阵
四、通过变换矩阵获取的信息,生成模型,达到AR效果
这就是一般的AR过程的特征图像的跟踪和标定方式,当然其中很多很多的细节我都没说出来,毕竟只是一个技术点的提及,更多的东西需要自己去实践中操作和发现
差不多了,这次的技术点就结束了,往后的五六个月应该都不会更新博客了,就这样。