ios全景图片开发

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

在项目中我们使用的是findHomography方法来进行变换矩阵的计算,返回值H就是我们所需要的矩阵.不使用OpenCV中的另一个方法getPerspectiveTransform这个方法是由于这个方法的效果比较差,一般使用这个方法是在照片角度,相机焦距等都非常稳定的时候来使用它,照片的拍摄越好,对算法的要求就越低,这样效率也就越高
在这里插入图片描述
由于需要用到过程中的数据,所以在需要的数据部分自己实现出来
在这里插入图片描述
5.图片的投影:由于两张图片不在同一空间平面上,所以需要将一张图片像另一张图片进行投影才可以进行图片的拼接,或者将两张图片向同一空间平面进行投影,一般会选择柱面投影,不过这样的话就要求手机拍摄的照片和水平面完全垂直,否则就会造成锥形投影的效果.以下是柱面投影变换公式
x’=rsin(a/2)+rsin(arctan((x-W/2)/r))
y’=H/2+r*(y-H/2)/k
其中:k=sqrt(r*r+(W/2-x)(W/2-x))
r=W/(2tan(a/2)),
r为拍摄焦距,a为每张图像所占的弧度角。
下面是柱面投影的部分代码
在这里插入图片描述
图片的拼接:先对两张图片进行曝光补偿处理,然后根据之前求到的变换矩阵来求取拼接之后的图片各个顶点的数据,这个需要根据一张基准图片和变换矩阵进行计算,求出各个顶点的数据之后就要对拼接之后的图片的长度和高度进行计算,然后使用warpPrespective方法进行图片的拼接,所需要的参数分别是基准图片,导出的Mat型全景图,变换矩阵, 以及全景图的尺寸. 下图是柱面投影时候两图片相交位置的示意
在这里插入图片描述
下面是求取变换后的图像顶点的代码
在这里插入图片描述
拼接后的图片处理:拼接之后会看到明显的缝隙,这个缝隙就是两站图片的拼接点,因此需要将两张图片重合的部分求取出来,然后遍历这一部分图片,根据距离两张图片的位置,根据权重进行过度操作处理
在这里插入图片描述
三.全景效果的展示
1.首先需要处理图片首尾部分,同样通过特征点检测,匹配两部操作来找到匹配的特征点,之后只需要通过计算得到图片首尾的重合部分的矩阵,然后得到对应的位置,将图片展示出来即可.
2.将图片放在一图片展示控件上,放置3张图片,再放置在一个可滑动控件上,然后监听照片滑动的位置,根据第一步求出的数据来安排控件的位置,当手机滑动到第三个控件的位置时,将第一个控件放置到第四个位置,反过来也是一样,保证用户所看到的界面始终保持在第二个控件上,这样对控件的复用可以节省内存的开销,并且提高效

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值