图像拼接中的一些问题 - 单应性矩阵?

11

我正在使用OpenCV 2.3.1和Visual Studio 2010进行图像拼接项目的开发。

目前我遇到了两个问题:

(因为我的声誉值不足10,所以我只能在此帖子中发布2个超链接。我将在评论区发布另外2个链接)

我按照以下链接中提到的步骤进行操作: Stitching 2 images in opencv

  1. 对两幅图像找出SURF特征点并匹配
  2. 利用RANSAC算法剔除离群点
  3. 计算单应性变换矩阵
  4. 将目标图像映射到参考图像上

下面的图片是我目前得到的结果:

两幅图像是由相机在同一位置但不同方向 (我使用了三脚架) 拍摄得到的。

enter image description here

然后我进行了另一个测试。这次我仍然使用同一台相机拍摄了两张照片。但是,我把相机从原来的位置移动了一点,然后拍摄了第二张照片。 结果相当糟糕,如下所示:

enter image description here

问题1:** 这是否意味着**如果两个相机处于不同的位置,标准全景图拼接技术(基于单应性变换或相机旋转模型)将无法工作?

我尝试对拍摄于不同位置的图像进行拼接,因为未来我想在不同位置使用2台相机实现拼接算法,以扩大视场范围,类似于这样:(请查看评论中的图片 Widen FOV)

但现在看起来我可能走了错误的方向 :(。


我刚刚发现,在算法过程中,特征点寻找和匹配占用了大部分时间。

问题2: 我能否只在两幅图像的某些部分(重叠区域)计算特征,然后仍然使用单应性变换进行变换?也就是说,不必计算整个图像。

我之所以这样想,是因为我认为如果我指定两幅图像之间的重叠区域的大小,那么就没必要在整个图像中计算特征。 如果我只在重叠区域计算和匹配特征,应该可以大大提高速度。

下面显示的第一个代码是计算整个图像特征的原始代码。

    int minHessian = 3000;

    SurfFeatureDetector detector( minHessian );
    vector<KeyPoint> keypoints_1, keypoints_2;

    detector.detect( frm1, keypoints_1 );
    detector.detect( frm2, keypoints_2 );

    //-- Calculate descriptors (feature vectors)  
    SurfDescriptorExtractor extractor; ///

    Mat descriptors_1, descriptors_2;

    extractor.compute( frm1, keypoints_1, descriptors_1 );
    extractor.compute( frm2, keypoints_2, descriptors_2 );
我尝试了以下措施来减少运行整个算法所需的时间:
    //detector.detect( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1 );
    //detector.detect( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2 );

    //-- Calculate descriptors (feature vectors)
    SurfDescriptorExtractor extractor; ///

    Mat descriptors_1, descriptors_2;

    extractor.compute( frm1(Rect(0.5*frm1.cols,0,0.5*frm1.cols,frm1.rows)), keypoints_1, descriptors_1 );
    extractor.compute( frm2(Rect(0,0,0.6*frm2.cols,frm2.rows)), keypoints_2, descriptors_2 );

使用上面的代码,计算时间显著减少,但结果很差: (我会在评论中发布图片,请检查 Bad Result

目前卡住了,不知道下一步该怎么做。非常希望能得到任何帮助和赞赏。 谢谢。


扩大视野 - SilentButDeadly JC
坏结果 https://lh3.googleusercontent.com/-Lx9ri2UqLBs/T-LesmLOUgI/AAAAAAAAAE0/wUkp9fwh4EU/s516/Bad.jpg - SilentButDeadly JC
2
嗨,我刚刚更新了你的问题并添加了图片,请看一下是否正确。我感觉自己把事情搞砸了。 - Abid Rahman K
2
是的,那就是我之前想做的事情。谢谢。 - SilentButDeadly JC
1个回答

8
问题1: 我不太确定,但是缝合问题似乎是由于两张图片之间的相机翻译造成的。只有全局单应变换,你才能完美地叠加这两张图片。单应性只适用于以下两种情况:
  1. 相机经历了纯旋转(无平移)
  2. 相机经历了一般运动,但场景是平面的

也就是说,如果不考虑瓶子,你的场景是相当平面的(物体与相机的平移比较远),因此单应近似可能仍然足够。您只需要正确混合图像即可。为此,您首先需要找到一个“切割”图像的位置,在该位置两个图像之间的差异最小,并应用(例如Laplacian)混合。对于您的摄像头安装在汽车顶部的问题,这种近似可能仍然是合理的,因此您仍然可以使用单应模型。

如果单应性与适当的混合不足以满足您的要求,则可能需要查看三维重建技术或其他“放宽”单应性要求的方法。文献中有几篇论文涉及拼接时的视差问题。但是,这些论文比基本的单应缝合要复杂得多。

问题2: 是的,只要您非常确定重叠区域在哪里即可。但是,您需要确保此重叠区域不太小,否则计算出的单应性可能会有偏差。 您办公室数据集的问题似乎是由于相机翻译引起的,如前所述。
最后,您可能需要稍微调整一下SURF特征检测/匹配参数。特征点似乎略微不足。

谢谢你的回答,但我还有一些问题:1.在这个上下文中,“平面”指的是什么?我有点困惑。
  1. “你首先需要找到一个地方“切”图像,在两个图像之间存在最小差异,并应用(例如拉普拉斯)混合。”嗯...你的意思是重叠区域吗?
3.现在完成整个步骤需要大约3秒钟,但在这个实验中只需要1秒钟。也许是因为我使用的图片...
- SilentButDeadly JC
哦,我的天啊...上面的评论非常混乱。我想最好在YouTube的私信中输入它们。 - SilentButDeadly JC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接