Lab8 - 全景图拼接

本次实验我们实现全景图拼接算法。

本次实验内容为课程作业,计算成绩。你需要将源代码、可执行程序(注明运行环境)和实验文档发送至pengsida@zju.edu.cn,邮件标题为Lab8-学号-姓名,压缩包和文件夹名称都为Lab8-学号-姓名

本次作业提交截止时间为2020年6月20日 23:59:59,逾期将要扣分。

全景图拼接回顾

全景图拼接是利用同一场景的多张图像通过重叠部分寻找匹配关系,从而生成整个场景图像的技术。 全景图的拼接方法有很多,如按场景和运动的种类可以分为单视点全景拼接和多视点全景拼接。

对于平面场景和只通过相机旋转拍摄的场景来说,可以使用求每两幅图像之间的一个Homography变换来映射到一张图像的方法,还可以使用恢复相机的旋转的方式得到最终的全景图。当相机固定只有水平方向旋转时,也可以使用柱面或球面坐标映射的方式求得全景图。

算法原理

柱面坐标转换

对于每一幅图像来说,我们都可以把它们投影到一个柱面上,得到柱面上的图像 。柱面图像的坐标变换为:

x=rtan1(xf)x'=rtan^{-1}(\frac{x}{f})

y=ryx2+f2y'=\frac {ry}{\sqrt{x^2+f^2}}

其中(x,y)(x',y')为柱面上的坐标,(x,y)(x,y)为平面图像坐标,其坐标原点都已移至图像中心,rr 为柱面半径,ff为焦距。

然而为了得到柱面投影图像,我们往往需要将柱面图像上的点逆变换到平面图像上的对应像素点,进行插值,得到完整的柱面图像,逆变换的变换公式为:

x=ftan(xr)x=ftan(\frac{x'}{r})

y=yrx2+f2y=\frac{y'}{r}\sqrt{x^2+f^2}

特征匹配

对每两幅相邻的柱面图像进行特征提取和匹配(特征可以选用SIFT、ORB等,可以使用OpenCV的函数实现),寻找两幅相邻图像的对应关系。

全景图拼接

使用上一步得到的匹配关系,求出每两幅柱面图像的一个平移变换,利用平移变换将所有图像拼接到一起。得到一幅全景图。

实验要求

接口要求

你需要实现名为 Panorama#### 的类,其中 #### 代表你学号的后四位。
这个类需要继承自接口类 CylindricalPanorama ,我们提供了头文件,请下载 hw8_pa.h 并包含在你的全景图类中,因为依赖OpenCV库,所需要的头文件需要自己补充。

class CylindricalPanorama {
public:
  virtual bool makePanorama(std::vector<cv::Mat>& img_vec,cv::Mat& img_out,double f) = 0;
};

img_vec为输入的平面图像,img_out为求出的全景图,f为相机焦距。
makePanorama函数实现全景图拼接功能。本次实验会根据图像插值,平移变换求解以及图像融合实现的复杂程度给予一定的加分奖励。

测试数据

本次试验需要完成两组两组图像序列的拼接任务。请下载两组测试数据,相机焦距也附在数据文件夹的K.txt文件中。将得到的拼接结果附在实验报告中。

数据1(ZIP)
数据2(ZIP)

参考文献

http://research.microsoft.com/pubs/75695/Szeliski-FnT06.pdf
http://faculty.cs.tamu.edu/jchai/CPSC641/szeliskiShum97.pdf