5

最近,我一直在尝试在 OpenCV 中拼接由直升机拍摄的低质量、低分辨率 (320x180) 图像。这是我得到的:

http://postimg.org/gallery/1rqsycyk/

拍摄的照片几乎是最低点,你可以看到重叠很多。每个镜头之间都有一个平移,我试图将物体放在地面上,以保持场景几乎是平面的,以免干扰单应性的要求。无论如何,在拼接过程中没有考虑到很多图片。

这里再举一个例子,(只有三张图片拼接在一起):

http://postimg.org/gallery/1wpt3lmo/

我正在使用 Surf Featuredetector,并认为图像质量低下不适合它,但我不确定。

这是我使用的代码,我在类似的问题OpenCV 非旋转图像拼接中找到了它,并决定使用它,因为它比我的效果更好:

    Mat pano;
    Stitcher stitcher = Stitcher::createDefault(false);

    stitcher.setWarper(new PlaneWarper());
    stitcher.setFeaturesFinder(new detail::SurfFeaturesFinder(1000,3,4,3,4));
    stitcher.setRegistrationResol(0.1);
    stitcher.setSeamEstimationResol(0.1);
    stitcher.setCompositingResol(1);
    stitcher.setPanoConfidenceThresh(1);
    stitcher.setWaveCorrection(true);
    stitcher.setWaveCorrectKind(detail::WAVE_CORRECT_HORIZ);
    stitcher.setFeaturesMatcher(new detail::BestOf2NearestMatcher(false,0.3));
    stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
    Stitcher::Status status = Stitcher::ERR_NEED_MORE_IMGS;
    try{
        status = stitcher.stitch(picturesTaken, pano);
    }
    catch(cv::Exception e){}

我的另一个猜测是手动进行拼接过程,而不是使用 Stitcher 类,但我不确定它是否会发生很大变化。所以问题是:尽管图像质量低,我怎样才能使拼接过程更加健壮?另外:定义 ROI 是否只对性能有影响,还是对实际拼接的机会有影响?

4

3 回答 3

4

考虑到输入图像的质量,结果还不错!

为了提高输出的质量,我会(按优先顺序):

  1. 估计相机失真,以便修复它并使匹配更容易
  2. 在拼接之前执行一些直方图或光照均衡
  3. 尝试增加图片之间的时间间隔或使用另一个拼接器。输出中的一部分模糊是由拼接器在合并重叠区域中的图像时创建的。
于 2013-08-22T13:56:18.500 回答
2

我发现了这个问题,这对我很有帮助。我调查了这个主题,并为您提供了一些其他提示:

关于查找相似图像:

  • 您将 SURFFeatureFidner 设置为 minHessian = 1000。它的价值非常大(OpenCV 建议 300,我有时使用 100)。这就是为什么只有匹配不是所有图像的原因。
  • 您将 PanoConfidendceThresh 设置为“1”,也许您应该设置“0.8”,它会拼接更多图像。

关于拼接图像的外观: Stitcher 的流水线中还有一些其他功能。尝试使用:

  • 缝合器.setSeamFinder(新细节::GraphCutSeamFinder(GraphCutSeamFinderBase::COST_COLOR))

  • 缝合器.setBlender(详细信息::搅拌机::创建默认(搅拌机::MULTI_BAND,假))

  • 缝合器.setExposureCompensator (detail::ExposureCompensator::createDefault(ExposureCompensator::GAIN_BLOCKS) )

也许这对你有帮助!

于 2013-12-25T11:51:31.440 回答
2

我认为问题在于您拍摄无纹理区域的照片,并且很难从这些平滑区域中提取出良好的独特关键点。

于 2013-08-22T13:29:16.427 回答