COLMAP Windows Build from Source踩坑合集 您所在的位置:网站首页 vcpkg安装libuv COLMAP Windows Build from Source踩坑合集

COLMAP Windows Build from Source踩坑合集

2023-03-24 11:46| 来源: 网络整理| 查看: 265

如果不想看废话请直接跳转至正戏

前戏

一般使用COLMAP进行三维重建时,如果没有特别的使用需求,可以直接下载pre-built binaries,双击图标即可使用GUI。但是,某些特殊需求单单在GUI中是无法完成的。

一种情况是,当对物体做三维重建时,我们的相机参数是已知的,比如DTU和BlendedMVS中既提供了图片,也提供了图片所对应的相机参数。那么这个时候,对数据集重新进行COLMAP重建就会置这些已知的参数不顾,重新生成它自己所理解的参数,这样就会对测试baseline的performance的工作造成很大影响。

好消息是,COLMAP知道我们的这个难处,并提供了一个解决方案(详见https://colmap.github.io/faq.html中的Reconstruct sparse/dense model from known camera poses部分)。该方案要求我们按照给定的structure和格式提供已知的参数。那么,就需要对数据集进行预处理,以符合其期待。此处给出转换完以后的structure和格式的截图。 结构 cameras.txt images.txt

cameras.txt

摘抄自https://colmap.github.io/format.html#output-format。

# Camera list with one line of data per camera: # CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[] # Number of cameras: 3 1 SIMPLE_PINHOLE 3072 2304 2559.81 1536 1152 2 PINHOLE 3072 2304 2560.56 2560.56 1536 1152 3 SIMPLE_RADIAL 3072 2304 2559.69 1536 1152 -0.0218531

目前不太清楚SIMPLE_RADIAL中最后一个参数的含义。但是在SIMPLE_PINHOLE中,根据文档描述,3个参数的意义为:焦距为2559.81像素,主点(principal point,我理解为相机中心)位于像素位置(1536,1152)。这些参数都可以由数据集图像和相机参数文件中获取。

images.txt # 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

一般将(QW, QX, QY, QZ)称作qvec,表示四元数旋转;(TX, TY, TZ)称作tvec,表示位移。NAME需与images文件夹中的图片对应。有将四元数转换为旋转矩阵的算法(不小心把上一篇文章的坑填了):

def qvec2rotmat(qvec): return np.array([ [1 - 2 * qvec[2]**2 - 2 * qvec[3]**2, 2 * qvec[1] * qvec[2] - 2 * qvec[0] * qvec[3], 2 * qvec[3] * qvec[1] + 2 * qvec[0] * qvec[2]], [2 * qvec[1] * qvec[2] + 2 * qvec[0] * qvec[3], 1 - 2 * qvec[1]**2 - 2 * qvec[3]**2, 2 * qvec[2] * qvec[3] - 2 * qvec[0] * qvec[1]], [2 * qvec[3] * qvec[1] - 2 * qvec[0] * qvec[2], 2 * qvec[2] * qvec[3] + 2 * qvec[0] * qvec[1], 1 - 2 * qvec[1]**2 - 2 * qvec[2]**2]]) def rotmat2qvec(R): Rxx, Ryx, Rzx, Rxy, Ryy, Rzy, Rxz, Ryz, Rzz = R.flat K = np.array([ [Rxx - Ryy - Rzz, 0, 0, 0], [Ryx + Rxy, Ryy - Rxx - Rzz, 0, 0], [Rzx + Rxz, Rzy + Ryz, Rzz - Rxx - Ryy, 0], [Ryz - Rzy, Rzx - Rxz, Rxy - Ryx, Rxx + Ryy + Rzz]]) / 3.0 eigvals, eigvecs = np.linalg.eigh(K) qvec = eigvecs[[3, 0, 1, 2], np.argmax(eigvals)] if qvec[0]


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有