2007年4月5日星期四

Panoramic Image Transform

也是去年十二月写的一个小程序,全景图像展开,很简单的算法,两天便完成了。不过刚开始想得比较复杂,比如考虑镜面方程(二次抛物面),成像模型等等。这样恢复的图像质量当然比较好,不过比较麻烦。后来使用了简易算法:project circle to clinder, 公式如下:
panoramic(w, h) omni-directional(R, r) // center of omni-directional image
p(x, y) --> p1(x1, y1) p0(x0, y0)
w = (R + r) / 2
h = R - r
theta = x / w
x1 = x0 + (r + x) * sin(theta)
y1 = y0 + (r + y) * cos(theta)

按上面公式展开得到的图像会有比例失调:上半部分拉伸了,下半部分压缩了,这是由于镜面的非线性映射造成的。于是我拟了一个简单的二次函数对下半部分图像进行非线性拉伸(注:与镜面方程无关,在此就不透露公式了:),下面是一些实验结果:




全景图















NN未拉伸的图



双线性插值并拉伸后的图




可以看到,拉伸处理后的图与实际环境的尺寸比例比较接近,效果还是挺好的。
此外也在linux下做了实时视频展开实验,将494x464的彩色图展成864x244的彩色图,使用双线性插值算法,也有很好的实时性,核心算法代码写得比较高效。

2 条评论:

匿名 说...

能解释下各个变量的意思吗?谢谢

trustno1 说...

c ++编程实例
c ++在自由空间中移动3D Box