我试图将两张图像放在一起 为了做到这一点,我使用这个C实现提取了筛选功能并在两个图像上找到匹配。
http://web.engr.oregonstate.edu/~hess/index.html
之后,我使用匹配点找到了单应矩阵。
http://www.ics.forth.gr/~lourakis/homest/
但是如果我在“cvWarpPerspective”函数中使用这个Homography Matrix,图像的某些部分会从可视区域中消失(负的corrdinates)。
为了解决这个问题,我尝试首先通过Homography矩阵管道图像的四个角来计算边界框。并移动初始图像然后扭曲它。但这导致翘曲的结果发生了变化。
有没有办法扭曲图像并将其保留在可视区域?
我将不胜感激任何帮助。提前谢谢......
答案 0 :(得分:1)
作为一项练习,我前段时间尝试过同样的事情并偶然发现同样的问题。我已经通过首先计算边界框来解决它,正如你所描述的那样,然后我编写了自己的变形函数。变形很简单,但你需要自己做lerp。因为一些像素方式的加权无论如何都需要良好的结果(比如来自不同图像的多个像素可能最终会出现在同一个输出像素上,因此需要进行混合),所以我放弃cvWarpPerspective并不是很糟糕。
答案 1 :(得分:0)
我认为你走在正确的轨道上。 您需要考虑移动图像时发生的图像转换。
另一种方法是在边缘周围填充源图像。根据视角的变化程度,您可能需要填写相当多的内容。此外,填充必须在特征匹配和变形矩阵之前完成。显然,您将使用更大的图像进行计算。
答案 2 :(得分:0)
编辑:
经过一番努力,我学到了一些东西:
在发现img1和img2之间的单应性,并因此获得了从1到2的转换矩阵之后,您几乎已准备好运行cvWarpPerspective。
首先,你需要填充img1。你应该可以很容易地获得img1的边界框。创建一个新的img大小boundingBox-> width + img2-> width * 2,boundingBox-> height + img2-> height * 2和cvCopy img 1到中间。
如果您现在尝试了cvWarpPerspective,那么您的转换将会关闭,因为您翻译了img1。我们需要制作另一个矩阵来说明这种翻译。如果将img1放在合成图像的中间,则将其左上角放置在(img2-> width,img2-> height)。使转换矩阵= {1,0,img2-> gt; width,0,1,img2-> height,0,0,0)。现在使用cvMatMul(翻译,单应性,结果)来获得最终的转换矩阵。
您现在可以使用复合>大小的图像和结果矩阵来使用cvWarpPerspective来扭曲图像1。
拼接还有很多工作要做,但这解决了翘曲图像从可视区域出来的问题。要完成拼接,您可能需要将image2粘贴到合成尺寸的图像上,为扭曲的图像创建蒙版,然后使用该蒙版将扭曲的图像复制到composite-image2上,以便获得外观漂亮的拼接图像。