instant-ngp复现

数据集准备

数据结构如下

1
2
3
-fox
-images
-transform.json

通过 scripts/colmap2nerf.py 处理视频或者一序列的图像,图像应避免动态模糊和虚焦。对于大型场景可能训练几分钟来增加锐度

锐度,即图像边缘对比度,在边缘部分增加白色和黑色边缘增加对比度

经过 COLMAP 稀疏重建后在 sphare/0 下生成三个 .txt 文件。

camera.txt

包含相机内参

以下为实例

1
2
3
4
5
# Camera list with one line of data per camera:
# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]
# Number of cameras: 159
1 SIMPLE_RADIAL 1920 1080 1496.1000558533603 960 540 -0.022162590119422163
2 SIMPLE_RADIAL 1920 1080 1487.0032035424961 960 540 0.020998321685288947
  • CAMERA_ID :对应每张图片的序号

  • MODEL : 相机的模型选择具体参考详见官方文档主要给出了几种建议, 无畸变时采用 simple model.

    1. SIMPLE_PINHOLE , PINHOLE: 小孔相机模型,在图像未畸变时使用,在此情况下,也可以通过更复杂的相机模型改进参数
    2. SIMPLE_RADIAL :对于在内参都不知道的情况下,每张图像有不同的相机校准。e.g internet photos??(从网络获取的图片?)
    3. OPENCV : 已知校准参数的情况下

    具体的每个模型的参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    // Simple Pinhole camera model.
    // f, cx, cy
    CAMERA_MODEL_DEFINITIONS(0, "SIMPLE_PINHOLE", 3)

    // Pinhole camera model.
    // fx, fy, cx, cy
    CAMERA_MODEL_DEFINITIONS(1, "PINHOLE", 4)

    // Simple camera model with one focal length and one radial distortion
    // parameter.
    // f, cx, cy, k
    CAMERA_MODEL_DEFINITIONS(2, "SIMPLE_RADIAL", 4)

    // Simple camera model with one focal length and two radial distortion
    // parameters.
    // f, cx, cy, k1, k2
    CAMERA_MODEL_DEFINITIONS(3, "RADIAL", 5)

    // OpenCV camera model.
    // fx, fy, cx, cy, k1, k2, p1, p2
    CAMERA_MODEL_DEFINITIONS(4, "OPENCV", 8)

    // OpenCV fish-eye camera model.
    // fx, fy, cx, cy, k1, k2, k3, k4
    CAMERA_MODEL_DEFINITIONS(5, "OPENCV_FISHEYE", 8)

    // Full OpenCV camera model.
    // fx, fy, cx, cy, k1, k2, p1, p2, k3, k4, k5, k6
    CAMERA_MODEL_DEFINITIONS(6, "FULL_OPENCV", 12)

    // FOV camera model.
    // fx, fy, cx, cy, omega
    CAMERA_MODEL_DEFINITIONS(7, "FOV", 5)

    // Simple camera model with one focal length and one radial distortion
    // parameter, suitable for fish-eye cameras.
    // f, cx, cy, k
    CAMERA_MODEL_DEFINITIONS(8, "SIMPLE_RADIAL_FISHEYE", 4)

    // Simple camera model with one focal length and two radial distortion
    // parameters, suitable for fish-eye cameras.
    // f, cx, cy, k1, k2
    CAMERA_MODEL_DEFINITIONS(9, "RADIAL_FISHEYE", 5)

    // Camera model with radial and tangential distortion coefficients and
    // additional coefficients accounting for thin-prism distortion.
    // fx, fy, cx, cy, k1, k2, p1, p2, k3, k4, sx1, sy1
    CAMERA_MODEL_DEFINITIONS(10, "THIN_PRISM_FISHEYE", 12)

    images.txt

    images.txt 示例:

1
2
3
4
5
6
7
8
# Image list with two lines of data per image:
# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME
# POINTS2D[] as (X, Y, POINT3D_ID)
# Number of images: 2, mean observations per image: 2
1 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180141.JPG
2362.39 248.498 58396 1784.7 268.254 59027 1784.7 268.254 -1
2 0.851773 0.0165051 0.503764 -0.142941 -0.737434 1.02973 3.74354 1 P1180142.JPG
1190.83 663.957 23056 1258.77 640.354 59070
`Q` 表示的旋转的四个参数?与 `Eigen::Quaterniond `格式相同  `T` 表示平移参数。第二行表示一个特征点在图像中的二维坐标。

points3D.txt

1
2
3
4
5
6
# 3D point list with one line of data per point:
# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)
# Number of points: 3, mean track length: 3.3334
63390 1.67241 0.292931 0.609726 115 121 122 1.33927 16 6542 15 7345 6 6714 14 7227
63376 2.01848 0.108877 -0.0260841 102 209 250 1.73449 16 6519 15 7322 14 7212 8 3991
63371 1.71102 0.28566 0.53475 245 251 249 0.612829 118 4140 117 4473

如果需要进一步 rectify, 可以把参数输入到 OpenCV 的 stereoRectify() 函数中,之后 initUndistortRectifyMap() , 最后使用 remap() 函数进行重映射 从而得到矫正的结果。

transform.json

1
2
3
4
5
6
7
8
9
10
11
12
13
"camera_angle_x": 1.2433395001651382,
"camera_angle_y": 0.7661685246315253,
"fl_x": 1339.9721836141384,
"fl_y": 1339.9721836141384,
"k1": -0.021131598158465558,
"k2": 0,
"p1": 0,
"p2": 0,
"cx": 960.0,
"cy": 540.0,
"w": 1920.0,
"h": 1080.0,
"aabb_scale": 16,

camera_angle_xangle_y = math.atan(h / (fl_y * 2)) * 2,即光心到边缘的最大角度。

fl_x 是相机的焦距大小,看了代码之后发现取的是最后一个图像得到的焦距,实际上在·1300-1496之间进行浮动,据通过手机厂商的数据发现是 26.8mm 等效焦距,实际焦距 5.4mm ??

现有数据集

Nerf: 将near plane 和 far plane 的空间转化成 NDC [-1,1],渲染时光线只截用该空间中的。

ngp: 没有采用NDC, unit cube ? 似乎没什么影响, aabb_scale 的作用就是为了限制渲染范围。

实验

  1. 对云雾的消除。推测原因:上方缺乏光线穿过,因此需要增加相机的视角。上中下 和 上。 如果我们增加相机上方视角更多的图片呢:预测应该不会有很大改善。
  2. 增加桌面的特征值
  3. 勾选 train extrinces、