工作流程

环侧

  1. 14个camera的RAW数据被ISP(Image Signal Processor)处理成PNG,同时进行伽马和色彩校准。
  2. 环测拼接使用最流行最基础的圆柱体投影法(有名经纬度投影法、Equirectangular projections)。
    此图便于理解
  3. 为了形成左右眼两幅图像,构造虚拟camera,体素取值由相邻的实体camera改体素的值,用光流法差值算得。
    左右眼与虚拟camera
  4. 为解决圆柱体投影法的桶形失真,拍摄棋盘校准。
  5. 为校准垂直视差,设置关键点,假设无穷远处垂直位移为0,光流也是0。
  6. 原始camera视域横竖90度,校准后降为77度

两极

  1. 无法形成左右两眼不同图像。
  2. 侧边立体视觉过渡到极点附近的2D图像。
  3. 用光流法与环侧拼接

顶部

Then the top image is warped according to the flow and alpha-blended (with deghosting) to composite the images.(此句不理解)

底部

三脚架两侧两个camera,用光流法拼接后去除三脚架的支撑杆。
不知为什么会在极点形成一个白斑?

代码

本段结合代码和文章,进行总结。核心源代码位于/Surround360/surround360_render/source目录下。

Calibration

分别有Color、Geometric、KeyPoint的校准,分别对应“环侧”中所述的1、4、5步。

Camera_isp

此文件下的源码,基本处理原数据,控制ISP的参数。对应“环侧”所述的第1步。

1.RawConvert.cpp include RawConvert.h RAW文件转化为16bit深度的图
RawConvert.h include BinaryFootageFile.h 二进制文件转化为RAW
BinaryFootageFile.cpp include BinaryFootageFile.h 此文件最为基础,处理二进制原始数据
2.Raw2Rgb.cpp include CameraISP.h & CameraIspPip.h RAW文件转化为Rgb格式的PNG
CameraISP.h include ColorspaceConversion.h 此文件是控制rgb色域转换
3.Unpacker.cpp include BinaryFootageFile.h & RawConvert.h & CameraIspPip.h

Optical_flow

光流法算插值,模拟camera的核心代码在此。对应“环侧”所述的第3步。
光流法简单介绍

1.OpticalFlowFactory.h include PixFlow.h 工厂类
PixFlow.h include OpticalFlowInterface.h & OpticalFlowVisualization.h & KeypointMachers.h
2.NovelView.h/.cpp include OpticalFlowFactory.h & OpticalFlowInterface.h 此文件生成虚拟的camera视角

Render

渲染拼接

1.ImageWarper.h/cpp include Camera.h 图像整经,缝合环侧14camera的图像
2.RigDescription.h include Camera.h Camera.h处理单个camera;RigDescription.h处理14个环侧camera
3.PoleRemoval.h/.cpp include OpticalFlowFactory.h & OpticalFlowInterface.h 移除底部的支撑杆

Test

facebook的debug

Thirdpart

整合了json的一个读取器。suppereasyjson。把camera的各种以json格式存储的参数读入工程项目。

Util

cpp工具包

传播

facebook为媒介

  1. 由于facebook的浏览端是单屏幕的,所以并不需要左右眼不同的图像。
  2. 为了传播低延迟的需要,需要进一步压缩圆柱投影的视频。
  3. 压缩为立方投影,文件体积缩小25%。
  4. 压缩为金字塔投影,文件体积缩小80%。

变形工具

变形工具,不过这个工具是将矩形投影转化为其他类型的投影。