本次实验我们实现全景图拼接算法。
本次实验内容为课程作业,计算成绩。你需要将源代码、可执行程序(注明运行环境)和实验文档上传到学在浙大网站,压缩包的名称为Lab7-学号-姓名.zip
。
本次作业提交截止时间为2024年5月5日 23:59:59,逾期将要扣分。
全景图拼接是利用同一场景的多张图像通过重叠部分寻找匹配关系,从而生成整个场景图像的技术。 全景图的拼接方法有很多,如按场景和运动的种类可以分为单视点全景拼接和多视点全景拼接。
对于平面场景和只通过相机旋转拍摄的场景来说,可以使用求每两幅图像之间的一个Homography变换来映射到一张图像的方法,还可以使用恢复相机的旋转的方式得到最终的全景图。当相机固定只有水平方向旋转时,也可以使用柱面或球面坐标映射的方式求得全景图。
对于每一幅图像来说,我们都可以把它们投影到一个柱面上,得到柱面上的图像 。柱面图像的坐标变换为:
其中为柱面上的坐标,为平面图像坐标,其坐标原点都已移至图像中心, 为柱面半径,为焦距。
然而为了得到柱面投影图像,我们往往需要将柱面图像上的点逆变换到平面图像上的对应像素点,进行插值,得到完整的柱面图像,逆变换的变换公式为:
对每两幅相邻的柱面图像进行特征提取和匹配(特征可以选用SIFT、ORB等,可以使用OpenCV的函数实现),寻找两幅相邻图像的对应关系。
使用上一步得到的匹配关系,求出每两幅柱面图像的一个平移变换,利用平移变换将所有图像拼接到一起。得到一幅全景图。
你需要实现名为 Panorama####
的类,其中 #### 代表你学号的后四位。
这个类需要继承自接口类 CylindricalPanorama
,我们提供了头文件,请下载 hw7_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
文件中。将得到的拼接结果附在实验报告中。
http://research.microsoft.com/pubs/75695/Szeliski-FnT06.pdf
http://faculty.cs.tamu.edu/jchai/CPSC641/szeliskiShum97.pdf