1. 简介
大家都知道VR,能够看到360度全景图像,即每帧图像记录了360度视角的成像。而工业界是怎样拍摄这样的图像的呢?目前博主了解的主要有两种做法:
- A.使用多个正常摄像头,每个摄像头拍摄固定角度的图像,然后再拼接
- B.使用两个视角(FOV)>=180度的鱼眼摄像头,再拼接如下图
我们将该任务明确输入输出:
- 输入:给定两张鱼眼图像拍摄的图像
- 输出:一张拼接好的矩形映射全景图(后续你可以根据这张全景图去做各种趣味剪辑)
2.我的解决方案
2.1 算法模块拆解
我先google网上的做法:发现类似的功能: https://moonagic.com/dualfisheye-to-equirectangular/
但是效果不是特别好。结合自己的经验,我将pipeline分为了三部分:
2.1.1 鱼眼相机的畸变矫正
目的: 将鱼眼图像展开为矩形图需要进行图像校正或投影变换。鱼眼图像通常采用一种特殊的透视投影,因此需要将其转换为常规的等距或直角投影以获得矩形图像。这个过程通常涉及到计算每个像素在新图像中的位置,然后将像素从鱼眼图像复制到新图像中的对应位置。
方法: 我们的方法分为两步。第一步: 我们将2维成像的鱼眼原始图像投影在3D球面上。第二步:我们采用球面透射投影, 我们首先定义了球面上的点的极坐标,然后计算了这些点的笛卡尔坐并使用球面透射投影的数学公式计算了投影点的坐标
2.1.2 特征点检测与匹配
目的: 我们将两个鱼眼图像转化为两张矩形图像,他们在边缘位置并没有对齐。在这里我们假设两张图像的边缘位置存在overlap, 然后我们需要在overlap中找到两张图的对齐变换关系,使得他们在overlap区间图像能够完全重合。
方法: 我们的方法仍然分为两步。第一步:我们将检测出overlap区间中的特征点来联系两个图像。特征点通常是图像中具有独特结构或纹理的位置,例如角点、边缘、斑点等。第二步:我们将使用特征点各自的特征描述子来进行匹配。我们支持下面三种方法:
Feature Points Detection | Matching |
---|---|
ORB | NN |
SIFT | NN |
SuperPoint | SuperGlue |
2.1.3 矫正对齐与拼接
目的: 将上面的两个图像合并成一个无缝的整体的过程。
方法: 我们的方法仍然涉及到两个主要步骤:图像矫正与图像拼接。第一步:图像矫正是利用上面获取的特征点匹配的信息来获取一个变换矩阵(单应性矩阵)。这个变换可以是平移、旋转、缩放、仿射变换或透视变换等来使两个图像通过在相同的坐标系统下对齐。第二步: 绝大多数情况下,overlap区间的图像不是完全对齐的, 如果使用阈值将两张图的overlap直接叠加,会使得拼接处有重影。我们使用了最佳缝合线的策略。
2.2 环境搭建
我们的代码仅仅依赖 python3 + numpy + opencv + torch
INSTALL.sh
init(){
if [[ `python -V` =~ "Python 3." ]] ;then
echo "python version: " `python -V`
else
echo "python version need >=3.6"
exit -2
fi
pip install -r ./requirements.txt
pip install torch==1.11.0 torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu
}
init
调试参数
我们在CROSS数据集中和目前已有的软件如三星等软件对比。(我们的模型没有加光照补偿, 但效果仍有一定的竞争力, 并且我们提供源码)
源代码
创作不易, 由于网上没有类似的代码, 博主花了大量时间较为完善的写下了整个pipeline代码, 按照创作难度收取了费用,敬请各位见谅。我们在各个渠道已经销售了过50份, 我们能提供鱼眼图像转换为矩形全景图的完整pipeline, 各个子模块被充分解藕。获取请前往 面包多。
【项目END】基于双鱼眼的全景图像CV算法实战