【问题标题】:Warping Images using cvWarpPerspective Results in Some Parts of the images out of the viewable area使用 cvWarpPerspective 扭曲图像会导致图像的某些部分超出可视区域
【发布时间】:2010-05-21 22:17:04
【问题描述】:

我正在尝试将两张图片拼接在一起。
为了做到这一点,我提取了筛选特征并使用这个 C 实现在两个图像上找到匹配项。

http://web.engr.oregonstate.edu/~hess/index.html

之后我使用匹配点找到了单应矩阵。

http://www.ics.forth.gr/~lourakis/homest/

但如果我在“cvWarpPerspective”函数中使用这个 Homography Matrix,图像的某些部分会超出可视区域(负坐标)。

为了解决这个问题,我首先尝试通过将图像的四个角通过 Homography 矩阵来计算边界框。并移动初始图像然后对其进行变形。但这会导致翘曲结果发生变化。

有什么方法可以扭曲图像并将其保留在可视区域中?

我将不胜感激。提前谢谢...

【问题讨论】:

    标签: c++ c image-processing opencv


    【解决方案1】:

    作为练习,我前段时间尝试过同样的方法,但偶然发现了同样的问题。正如您所描述的那样,我首先通过计算边界框来解决它,然后我编写了自己的变形函数。翘曲很简单,但是你需要自己做lerp。由于无论如何都需要一些像素加权以获得良好的结果(例如来自不同图像的多个像素可能最终在同一个输出像素上,因此需要混合),所以我对放弃 cvWarpPerspective 并不感到难过。

    【讨论】:

      【解决方案2】:

      编辑:

      经过更多的努力,我学到了一些东西:

      在发现 img1 和 img2 之间的单应性并因此得到从 1 到 2 的变换矩阵后,您几乎可以运行 cvWarpPerspective。

      不过,首先,您需要填充 img1。您应该能够相当容易地获得 img1 的边界框。新建一个大小为boundingBox->width+img2->width*2的img,boundingBox->height+img2->height*2,cvCopy img 1到中间。

      如果您现在尝试 cvWarpPerspective,您的转换将会关闭,因为您翻译了 img1。我们需要制作另一个矩阵来解释这种翻译。如果将 img1 放置在合成图像的中间,则将其放置在左上角 (img2->width,img2->height)。制作一个平移矩阵 = {1,0,img2->width,0,1,img2->height,0,0,0)。现在使用 cvMatMul(translation,homography,resultant) 得到最终的变换矩阵。

      您现在可以使用 cvWarpPerspective 使用复合尺寸图像和生成的矩阵来扭曲图像 1。

      在拼接方面还有一些工作要做,但这可以解决您的图像变形超出可视区域的问题。要完成拼接,您可能需要将 image2 粘贴到合成大小的图像上,为扭曲的图像创建蒙版,然后使用该蒙版将扭曲的图像复制到复合图像 2 上,这样您就可以获得漂亮的拼接图像。

      【讨论】:

        【解决方案3】:

        我认为你在正确的轨道上。 您需要考虑移动图像时发生的图像转换。

        另一种方法是在边缘填充源图像。根据视角的变化程度,您可能需要进行大量填充。此外,填充必须在特征匹配和变形矩阵之前完成。显然,您将在计算方面为使用更大的图像付费。

        【讨论】:

          猜你喜欢
          • 2017-12-24
          • 1970-01-01
          • 2012-01-05
          • 1970-01-01
          • 1970-01-01
          • 2013-02-21
          • 2016-07-03
          • 2014-11-14
          • 1970-01-01
          相关资源
          最近更新 更多