opencv使用经纬法把鱼眼照片展开

前两天工作需要买了一个佳能8-15mm的鱼眼镜头,8mm镜头其实成像就是180度的鱼眼镜头,成像效果如下图:

opencv使用经纬法把鱼眼照片展开_第1张图片

这里因为买的相机body是全画幅的,CCD长宽比是3:2的,所以调至镜头到8mm是不能占满整个CCD,以前的博客有写过这么把全景照片或者视频展示的资料和实现情况贴出来:鼠标控制全景照片观看

我就想如果前后拍两张或者拍三张那么就不需要用很多个镜头拼接,只需要2-3个鱼眼镜头拼接就行了,现在主流的全景摄像头也就是用两个大鱼眼镜头拼接(如下图gear360)

opencv使用经纬法把鱼眼照片展开_第2张图片

图像或者视频拼接opencv的stitching模块很多,直接用或者你是相关专业的自己cmake后改源码也可以,这个我也不重复啰嗦了,我刚好手头也有gear360拍摄了一下照片:

opencv使用经纬法把鱼眼照片展开_第3张图片

这是拼接以后的,没拼接前就是两个大圆圈
opencv使用经纬法把鱼眼照片展开_第4张图片

gear360的镜头是195度的,所以它是能够有重叠部分进行匹配和拼接的,但我个人觉得他的两个镜头的拼接过程中特征查找和匹配可能是一次成型,也就是选好一个拼接最好的距离范围后定好拼接参数,以后所以的都按照这个来,拼接的时候只做融合部分,不然实时效率不可能这么高,而且相片能固定大小。不扯这么远,那么现在这个canno的8mm成像照片肯定不能就这样进行拼接,肯定要展成矩形,也就是像把一个地球给展成世界地图一样,现在是半球(180°)也应该展成什么从北纬90°到南纬90°,本初子午线到东经180°嘛,所以查阅资料发现这样的方式成为经纬法,自行百度鱼眼照片经纬法展开之类的,专利论文都一大堆,我这就不重复了。

通过理解以后参考一些论文以及代码,这里参考了论文:经纬法传送门 以及在github上面把一个哥们成型的代码抠了我需要的那部分改动了一小点,github传送门 。把这个下下来后,把findCircleParameter和corrctor代码抠出来就行,这里面两个步骤也就是一个找我们这个照片的圆参数,后一个也就是用经纬法展开这个鱼眼照片了,里面记得params.distMap是选择LATITUDE_LONGTITUDE,这哥们是把这个作为他的毕业设计,所以详细的在他的paper目录下还有他的论文,大家也可以多参考参考。我因为有些应用附加在上面,所以代码很累赘,我把自己的来源都摆出来,希望大家还是多去看一下这些,不做拿来主义,我以前基本上也是把来来源都贴出来,说下自己怎么做的就点到为止了,我自己的代码也就不贴了,自己动手,体会更深,如有不明白,可以一起讨论。然后我再贴实现的效果。

有效圆形区域提取:

opencv使用经纬法把鱼眼照片展开_第5张图片

经纬展开图:

opencv使用经纬法把鱼眼照片展开_第6张图片

OPENGL全景观看:

视角1:
opencv使用经纬法把鱼眼照片展开_第7张图片
视角2:
opencv使用经纬法把鱼眼照片展开_第8张图片

你可能感兴趣的:(CV,C++)