我正在尝试将两个图像粘合在一起。
为了做到这一点,我提取了sift特征,并使用这个C实现在两个图像上找到匹配。
http://web.engr.oregonstate.edu/~hess/index.html
之后,我使用匹配点找到了单应矩阵。
http://www.ics.forth.gr/~lourakis/homest/
但是如果我在"cvWarpPerspective“函数中使用这个单应矩阵,图像的某些部分就会超出可视区域(负坐标)。
然后移动初始图像,然后将其扭曲。但这导致翘曲结果发生了变化。
有没有办法扭曲图像并使其保持在可见区域?
如果有任何帮助,我将不胜感激。先谢谢你...
发布于 2010-06-07 21:50:35
作为练习,我不久前也尝试过同样的方法,偶然发现了同样的问题。我已经通过首先计算边界框来解决它,就像你所描述的那样,然后我编写了我自己的扭曲函数。变形很简单,但是你需要自己做lerp。因为无论如何都需要一些像素加权才能得到好的结果(比如来自不同图像的多个像素可能最终会出现在同一个输出像素上,因此需要进行混合),因此我并不觉得放弃cvWarpPerspective是件坏事。
发布于 2010-06-01 23:36:41
我认为你在正确的轨道上。您需要考虑在移动图像时发生的图像转换。
另一种方法是在边缘周围填充源图像。根据视角的改变程度,您可能需要填充相当多的内容。此外,填充必须在特征匹配和翘曲矩阵之前完成。显然,你将为使用更大的图像而付出计算方面的代价。
发布于 2011-10-11 04:56:14
编辑:
经过更多的工作,我学到了一些东西:
在发现img1和img2之间的单应性之后,因此得到了从1到2的转换矩阵,您几乎已经准备好运行cvWarpPerspective了。
不过,首先需要填充img1。您应该能够相当容易地获得img1的边界框。创建一个新的img,大小为boundingBox>width+img2->width*2,boundingBox>height+img2->height*2,中间是cvCopy img1。
如果您现在尝试cvWarpPerspective,您的转换将会关闭,因为您已经转换了img1。我们需要制作另一个矩阵来解释这个转换。如果你把img1放在合成图像的中间,那么你把它放在左上角的位置(img2->width,img2->height)。制作一个平移矩阵= {1,0,img2->width,0,1,img2->height,0,0,0)。现在使用cvMatMul(翻译,单应,结果)来获得最终的转换矩阵。
现在,您已经准备好使用cvWarpPerspective,使用合成大小的图像和结果矩阵来扭曲图像1。
有更多的工作要做的缝合,但这解决了您的问题,扭曲的图像走出了可见区域。
https://stackoverflow.com/questions/2885967
复制相似问题