opencv warp(扭曲)球面投影的原理

关于坐标系变换,可以参考:

http://blog.csdn.net/wangxiaokun671903/article/details/37966891

在opencv的全景视频拼接demo stitching_detailed中,用到了warp,主要是创建用于多幅图像融合的表面,默认是球面投影,其原理分析如下:

直观说分3步:

1.矩形->曲面

矩形铺在球面上(像素坐标系->世界坐标系),这个时候看起来这个矩形看起来已经不是矩形了,变成了一个四个边有弧度的形状;

2.曲面->矩形

拉伸这个形状使之从变成矩形(求各个弧形边的最外沿坐标,或者说曲面各个弧边的切线构成的平面矩形);

3.扭曲变换

将这个矩形通过反变换(世界坐标系->像素坐标系),使之变成一个扭曲的平面。


每一步的实现:

1.前向变换,三维重建:

SphericalProjector::mapForward
1)二维转三维->将原图的mask矩形轮廓的像素坐标乘以R(旋转矩阵)和K(内参)的逆矩阵,得到空间三维坐标;
2)将三维坐标(x,y,z)转换成球面的极坐标(其值为球面坐标的仰角和张角对应的弧度),球半径为焦距;

2.获得产生的曲面的外围矩形轮廓,曲面->矩形,会有拉伸;

RotationWarperBase<P>::detectResultRoiByBorder

3.反向变换:

SphericalProjector::mapBackward
1)产生的新矩形挨个像素将其作为球面坐标转换回空间三维坐标(x,y,z);
2)三维转二维->空间三维坐标乘以R和K矩阵,得到像素坐标。


4.经过以上步骤得到两个分别沿x、y轴转换的映射矩阵;
5.原图与这两个矩阵做remap操作得到投影后的图像。

猜你喜欢

转载自blog.csdn.net/sonysuqin/article/details/60963847