ios全景图片开发

主要使用技术:特征点检测,特征点匹配, ,根据特征点求取变换矩阵,根据变换矩阵对图片进行投影,图片的拼接,拼接后的图片的过的度处理,首尾图片的处理
ios全景图片开发
使用框架:OpenCV
一.OpenCV的配置
在OpenCV中文网或者OpenCV官网都可以,下载所需要的版本的OpenCV,本项目中选择的是2.4.13.OpenCV和其他的框架有些不同,1.0,2.0,3.0几个大版本的侧重点不同,最适合用来做图片拼接的是2.0的版
ios全景图片开发
下载完OpenCV之后就需要添加对应的依赖库,分别是libc++.tbd,AVFoundation.framework,CoreGraphics.framework,CoreImage.framework,QuartzCore.framework,Accelerate.framework,以及使用摄像头需要的对应框架CoreVideo.framework,CoreMedia.framework,AssetsLibrary.framework
ios全景图片开发
这些都配置好编译会发现有报错,因为官方的框架中少了一个libc++.dylib这个框架,需要在添加依赖库的时候add other linker,然后通过对应的路径查找到这个框架,注意在添加这个框架的时候需要把Copy If Need这个选项勾选上,以保证框架被拷贝到工程中.再编译之后发现会出现更多的问题,不过仔细看报错信息都是有关C++的,这样很多文件都找不到,这就需要我们在找不到文件内容的类中在引用头文件的位置添加#ifdef __cplusplus,在整个类的末尾添加#endif,还有对应的Enable Bitcode的设置,要修改成NO才可以,再次编译之后发现编译成功
ios全景图片开发
由于iOS所使用的语言是Objective-C,也就是C语言的超集,而OpenCV现在基本都是由C++编写的,所以在使用的时候需要修改对应的.m文件,使它变成.mm文件,然后修改该类的type,修改成C++,操作如下图
ios全景图片开发
这里需要的对应的头文件也比较多,其中UIImage+OpenCV和UIImage+Rotate是自己写的,也都是为了OpenCV服务的,主要是转换类型以及一些简单的二次封装.由于OC是不支持命名空间的,所以在这里也需要声明一下,下图就是头文件和命名空间的声明
ios全景图片开发
二.图片拼接部分
先对图片的类型进行转换,转换成C++中的Mat类型,这样方便之后的处理,在这里OpenCV没有提供相应的方法,所以需要自己写出对应的方法
ios全景图片开发
ios全景图片开发
特征点检测:先对图片进行灰度值转换,从而降低计算量,设置好海塞矩阵阈值,本项目设置为800,然后使用OpenCV中的detect方法进行特征点的检测,之后用compute方法进行特征点的描述,为了之后的特征点匹配.这里的特征点检测我使用的是surf算法,一般特征点检测会用三种算法:sift,surf,orb.其中sift的效果最好,同样消耗的资源也最多,surf要比sift算法速度快很多,效果会差一些,不过相差不是特别大,在可接受范围,orb算法的效率非常高,但是效果太差,相比之下,surf算法是最适合当前的要
ios全景图片开发
由于使用的方式不同,所以下面又写了另外一种方法,用来处理图片首尾连接时的方法
ios全景图片开发
特征点匹配:对特征点进行排序,然后根据自己的需求选取最优的配对特征点.这里匹配特征点使用的是FlannBasedMatcher方法,不使用BFMatcher的原因是该方法是暴力获取到所有的匹配点,然后进行对比,这需要消耗的资源过多,而FlannBasedMatcher是近似匹配,效率会提高很多.
ios全景图片开发
4.求取变换矩阵:这个变换矩阵主要是根据匹配的特征点来进行计算的,这个变换矩阵是两张图片之间的变换关系,这里选用的算法是RANSAC算法.

在项目中我们使用的是findHomography方法来进行变换矩阵的计算,返回值H就是我们所需要的矩阵.不使用OpenCV中的另一个方法getPerspectiveTransform这个方法是由于这个方法的效果比较差,一般使用这个方法是在照片角度,相机焦距等都非常稳定的时候来使用它,照片的拍摄越好,对算法的要求就越低,这样效率也就越高