首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用cvWarpPerspective扭曲图像会导致图像的某些部分超出可视区域

使用cvWarpPerspective扭曲图像会导致图像的某些部分超出可视区域
EN

Stack Overflow用户
提问于 2010-05-21 22:17:05
回答 3查看 2.5K关注 0票数 2

我正在尝试将两个图像粘合在一起。

为了做到这一点,我提取了sift特征,并使用这个C实现在两个图像上找到匹配。

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

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

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

但是如果我在"cvWarpPerspective“函数中使用这个单应矩阵,图像的某些部分就会超出可视区域(负坐标)。

然后移动初始图像,然后将其扭曲。但这导致翘曲结果发生了变化。

有没有办法扭曲图像并使其保持在可见区域?

如果有任何帮助,我将不胜感激。先谢谢你...

EN

回答 3

Stack Overflow用户

发布于 2010-06-07 21:50:35

作为练习,我不久前也尝试过同样的方法,偶然发现了同样的问题。我已经通过首先计算边界框来解决它,就像你所描述的那样,然后我编写了我自己的扭曲函数。变形很简单,但是你需要自己做lerp。因为无论如何都需要一些像素加权才能得到好的结果(比如来自不同图像的多个像素可能最终会出现在同一个输出像素上,因此需要进行混合),因此我并不觉得放弃cvWarpPerspective是件坏事。

票数 1
EN

Stack Overflow用户

发布于 2010-06-01 23:36:41

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

另一种方法是在边缘周围填充源图像。根据视角的改变程度,您可能需要填充相当多的内容。此外,填充必须在特征匹配和翘曲矩阵之前完成。显然,你将为使用更大的图像而付出计算方面的代价。

票数 0
EN

Stack Overflow用户

发布于 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。

有更多的工作要做的缝合,但这解决了您的问题,扭曲的图像走出了可见区域。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2885967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文