【算法】双鱼眼拼接制作360度VR取景器/dual fisheye to equirectangular

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 DetectionMatching
ORBNN
SIFTNN
SuperPointSuperGlue
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算法实战

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
360视频转换为全景图需要以下步骤: 1. 抽取视频帧:从视频中抽取一定数量的帧用于生成全景图。 2. 鱼映射:将每个帧转换为鱼图像。 3. 投影全景图像:将鱼图像投影到全景图像上。 4. 拼接全景图像:将所有投影后的鱼图像拼接成一个全景图像。 以下是一个Python代码示例,用于将360视频转换为全景图: ```python import cv2 import numpy as np # 读取视频 cap = cv2.VideoCapture('input_video.mp4') # 视频宽和高 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) # 抽取的帧数和每个帧的间隔 num_frames = 20 frame_interval = int(cap.get(cv2.CAP_PROP_FRAME_COUNT) / num_frames) # 鱼半径和中心点 fisheye_radius = int(width * 0.5) fisheye_center_x = int(width * 0.5) fisheye_center_y = int(height * 0.5) # 全景图像 panorama = np.zeros((height, width, 3), np.uint8) for i in range(num_frames): # 读取视频帧 cap.set(cv2.CAP_PROP_POS_FRAMES, i * frame_interval) ret, frame = cap.read() # 将帧转换为鱼图像 fisheye = cv2.fisheye.undistortImage(frame, np.eye(3), np.eye(5), K=np.eye(3)) # 将鱼图像投影到全景图像上 for y in range(height): for x in range(width): theta = np.arctan2(y - fisheye_center_y, x - fisheye_center_x) r = np.sqrt((x - fisheye_center_x) ** 2 + (y - fisheye_center_y) ** 2) if r < fisheye_radius: phi = np.arcsin(r / fisheye_radius) r_ = fisheye_radius * np.tan(phi) x_ = int(fisheye_center_x + r_ * np.cos(theta)) y_ = int(fisheye_center_y + r_ * np.sin(theta)) panorama[y, x] = fisheye[y_, x_] # 显示全景图像 cv2.imshow('Panorama', panorama) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上代码使用OpenCV库中的 `cv2.fisheye.undistortImage()` 函数将每个帧转换为鱼图像,并使用投影技术将鱼图像投影到全景图像上。最后,将所有投影后的鱼图像拼接成一个全景图像。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热血小蚂蚁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值