【问题标题】:Some problems on image stitching - homography?图像拼接的一些问题——单应性?
【发布时间】:2012-06-23 11:33:30
【问题描述】:

我正在 Visual Studio 2010 上使用 OpenCV 2.3.1 进行图像拼接项目。

我目前有 2 个问题。

(我的声誉不超过10,所以我只能在这个帖子中发布2个超链接。我会在评论区发布另外2个)

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

  1. 在两张图片中查找 SURF 特征并进行匹配
  2. 使用 RANSAC 去除异常值
  3. 计算单应性
  4. 将目标图像变形为参考图像

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

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

然后我尝试了另一个测试。这次我仍然使用同一台相机拍摄 2 张​​图像。然而,我将相机从原来的位置移动了一点,然后我拍了第二张照片。 结果相当糟糕,如图所示:

问题1:**这是否意味着**如果两个摄像头在不同的位置,标准全景拼接技术(基于单应性或摄像头旋转模型)将不起作用?

我尝试拼接在不同位置拍摄的图像,因为将来我想在不同位置的 2 个相机上实现拼接算法,以扩大 FOV, 有点像这样:(我会在评论中发布图片,请检查加宽FOV

但现在看来我走错路了:(。


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

问题 2: 我可以只计算 2 张图像的某些部分(重叠区域)的特征,并仍然使用 Homography 执行转换吗? 即,不计算整个图像。

我这样认为是因为我认为如果我指定 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

目前卡住了,不知道下一步该做什么。真的希望并感谢任何帮助。 谢谢。

【问题讨论】:

标签: image opencv homography


【解决方案1】:

问题 1: 我不能很确定,但拼接的问题似乎是由于两张图片之间的相机转换造成的。仅使用全局单应性变换,您无法完美地叠加 2 个图像。单应性仅在以下两种情况下就足够了:

  1. 相机进行纯旋转(无平移)
  2. 相机进行一般运动,但场景是平面的

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

如果使用适当混合的单应性还不够,您可能需要查看 3D 重建技术或其他“放松”单应性要求的方法。文献中有几篇论文涉及镶嵌过程中的视差。然而,这些比基本的单应性拼接要复杂得多。

问题 2: 是的,这是可以做到的,只要您非常确定重叠的位置。但是,您需要确保此重叠区域不会太小,否则您计算的单应性可能会出现偏差。 如前所述,您的办公室数据集的问题似乎是由于相机翻译造成的。

最后,您可能需要稍微调整一下 SURF 特征检测/匹配参数。特征点似乎有点偏低。

【讨论】:

  • 感谢您的回答,但我对此仍有一些疑问: 1.“平面”在上下文中指的是什么?我有点困惑。 2.“您首先需要找到一个地方来“剪切”两个图像之间差异最小的图像,并应用(例如拉普拉斯)混合。”嗯……你是说重叠区域吗? 3.现在完成整个步骤大约需要3秒,但在这个实验中需要1。可能是由于我使用的图片...
  • 天哪……上面的评论很乱。我想最好在 youtube 的 P.M 中输入这些内容...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 2013-03-21
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多