图像拼接算法原理 1
来源:互联网 发布:dnf强化改版数据 编辑:程序博客网 时间:2024/05/26 02:21
本系列文章为作者原创,初载于我们的Blog“额外维度”,转载于此。
多路视频实时全景拼接Demo可见我们的youku主页。
0. 引言
图1,2,3. 两张图片的拼接
图像拼接是计算机视觉中一个有趣的领域,它把来自多个不同视角相机的图像变换到同一视角下,无缝拼接成一张宽视野图像(比如360度全景图,甚至360度*180度的球面全景)。上图所示,即为两张图像的拼接,结果基本是完美的。
需要注意的是,由于相机各自的指向角度不一样,因此两图片中来自同样场景的部分并不能够通过平移图像而完全重合。比如上图中那栋带有岭南风格拱顶的房子,它的屋檐在左图中要比右图中更水平些,如果试图通过平移对齐像素来拼接两幅图,结果必然不自然(比如在屋檐处出现拐角)。两图要做到完美叠合,不是一个平移变换能做到的。当然,肯定存在这样一个变换,那它是什么呢?
事实上这里边的数学原理(射影几何)很古老,什么情况下不同位置、视角的相机可以变换到同一视角下拼接起来也是久为人知的,只不过能够利用计算机来进行大规模自动拼接,还是近些年才成熟起来的事。
那到底什么情况下图像可以拼接,如何拼接呢?不妨先摆出结论吧:在两种情况下图像可拼接,一是各相机几何中心重合;二是各相机位置任意,但场景是一个平面。一种特殊情况,场景为远景时,可以近似的等价于一个平面场景,从而也是可拼的。拼接的方法很简单,在满足上述两种情况之一时,存在一个单应性变换(Homography),能够将一个相机的图像变换到另一个相机的视角下从而可以进行拼接。
下面我们用一套直观的语言来讲解这个变换,以及更复杂些的拼接方法。
1. Homography
图 4. 单应性变换
如图,计算机视觉中,我们用一个投影中心点和一张图像平面来刻画一个理想的相机。点与平面的距离为焦距,任意场景点所成像点用这样一种简单的方式来决定:将它与投影中心连线,连线与图像平面的交点即像点位置。图中给出了两个共中心的相机,它们有不同的指向(因而也有不同的图像平面$$P$$和$$P^{\prime}$$),同一场景点$$S$$在两个平面上的像点由紫线与两平面的交点$$D$$、$$D^{\prime}$$给出。到这里我们就直观的得到了这样一个变换:$$P$$上像点到$$P^{\prime}$$上对应像点的一个映射。这个映射可以把两张不同视角下拍摄的照片变换到同一视角下,从而能够完美拼接两张图像。这个映射正是我们要说的单应性变换。
到这里我们可以回头来解释另一个问题,为什么要求相机共中心?不妨反过来考虑,如果两相机不共中心,会出现什么样的情况?如图所示,
图 5. 单应性的破坏
我们让两相机的投影中心$$O$$、$$O^{\prime}$$相离。这时可以看到,$$S_1$$、$$S_2$$两点原本在相机$$O$$上投影到同一像点,这时在相机$$O^{\prime}$$上却投影到了不同像点。这意味着相机$$O^{\prime}$$看到了在$$O$$视角下被遮挡而看不到的内容,此时我们无法把$$O^{\prime}$$看到的图像变换到$$O$$的视角下。这就解答了我们之前的问题:非共中心放置时,各相机看到的内容太丰富以至于不能变换到同一视角下。读者可以检查,在相机共中心时,一个相机中被投影到同一像点的场景点,总会在另一相机中也被投影为同一像点。
事实上,在相机摆位任意时,我们看到的信息是如此丰富,以至于可以尝试重建出场景点的三维坐标。现代的三维重建算法可以利用不同位置、视角下拍摄的图像重建出物体的三维模型,这是后话。
当然,读者仍然可能想起,除掉共中心情形,我们还说过,相机摆位任意,但场景为一个平面时也是存在单应变换的。我们在这里不再给出这种情况的直观解释,读者可以自己思考。
(未完待续)
- 图像拼接算法原理 1
- 图像拼接算法原理 1
- 图像拼接算法原理 2
- 图像拼接原理
- 图像拼接中的算法
- 图像拼接算法
- 图像拼接中的RANSAC算法
- 图像拼接算法及实现
- 图像拼接算法的基本原理
- C++\opencv 图像拼接算法
- 图像拼接算法的基本原理
- 图像拼接笔记(1)
- 图像拼接原理与相关技术
- 图像拼接原理与相关技术
- 一种三角函数权重的图像拼接算法
- 图像拼接算法总结(一)
- 图像拼接算法总结(二)
- opencv多幅图像的拼接算法
- 大话设计-组合模式
- Hibernate的QBC查询
- oracle 添加索引函数的使用
- 【C#第一战】——宏观看C#
- error: 'std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _T
- 图像拼接算法原理 1
- YUM
- android之listview点击监听和长按监听的实现和区分
- javascript 面向对象的编程上
- linux常用查看硬件设备信息命令
- Java 反射机制
- WPF工程打开控制台并输出 Output to console from a WPF application
- 解决初始界面后EditText自动获取焦点 弹出软键盘
- 安卓蓝牙开发的一些经验和教训