windows

colmap
在这里插入图片描述
下载解压后运行
在这里插入图片描述
在这里插入图片描述

数据准备
在这里插入图片描述

准备工作文件夹,images存放文件,sparse存放colmap结果文件
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
导出模型在sparse下的0文件夹
在这里插入图片描述
在这里插入图片描述

ubuntu

官网地址

官方安装方法:

apt-get update
apt-get install colmap

   
AI写代码 dart
运行
  • 1
  • 2

官方包网址:https://debian.pkgs.org/11/debian-main-amd64/colmap_3.6+really3.6-1_amd64.deb.html

手动安装

sudo apt-get install \
    git \
    cmake \
    build-essential \
    libboost-program-options-dev \
    libboost-filesystem-dev \
    libboost-graph-dev \
    libboost-system-dev \
    libboost-test-dev \
    libeigen3-dev \
    libsuitesparse-dev \
    libfreeimage-dev \
    libmetis-dev \
    libgoogle-glog-dev \
    libgflags-dev \
    libglew-dev \
    qtbase5-dev \
    libqt5opengl5-dev \
    libcgal-dev

   
AI写代码 python
运行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

ubuntu16.04/18.04执行下面语句

sudo apt-get install libcgal-qt5-dev

   
AI写代码 python
运行
  • 1

下载Ceres Solver
注意如果有anaconda,将anaconda改名(名字加个1什么的),避免干扰Ceres编译

sudo apt-get install libatlas-base-dev libsuitesparse-dev
git clone https://ceres-solver.googlesource.com/ceres-solver
cd ceres-solver
git checkout $(git describe --tags) # Checkout the latest release
mkdir build
cd build
cmake .. -DBUILD_TESTING=OFF -DBUILD_EXAMPLES=OFF
make -j
sudo make install

   
AI写代码 python
运行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

如果访问不了google官网可以用下面替换,注意要切合2.00或2.1.0分支,不能拉起master

git clone https://github.com/ceres-solver/ceres-solver.git

   
AI写代码 python
运行
  • 1

colmap克隆

git clone https://github.com/colmap/colmap
cd colmap
git checkout dev
mkdir build
cd build
cmake ..
make -j
sudo make install

   
AI写代码 python
运行
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

验证

colmap -h
colmap gui

   
AI写代码 python
运行
  • 1
  • 2

colmap处理数据和windwos一样,准备好工作目录,新建images文件夹存放照片,新建sparse文件夹

图像特征提取
相机内参已知的话通过ImageReader.camera_params传入

colmap feature_extractor --database_path database.db --image_path images --ImageReader.camera_model SIMPLE_PINHOLE  --ImageReader.camera_params "1813.3334,1920,1080"

   
AI写代码 python
运行
  • 1

相机内参未知

colmap feature_extractor --database_path database.db --image_path images --ImageReader.camera_model SIMPLE_PINHOLE  --SiftExtraction.use_gpu 1 --ImageReader.single_camera 1

   
AI写代码 python
运行
  • 1

使用gpu加速 --SiftExtraction.use_gpu 1
使用单个摄像机 --ImageReader.single_camera 1
在这里插入图片描述

  • SIMPLE_PINHOLE,PINHOLE:适用于已知无畸变的图像。两个模型分别对应于一个统一焦距和两个分离焦距。不过即使是无畸变图像,Colmap还是会尝试使用更复杂的相机模型去优化相机内参。
  • SIMPLE_RADIAL, RADIAL:适用于内参位姿且每张图像来自于不同的相机标定,比如互联网图像。两个模型都是 Opencv 模型的简化版本,分别使用一个和两个参数只建模了径向畸变。
  • OPENCV, FULL_OPENCV:适用于已知标定参数的情况。如果多张图像共享内参,可以使用 Colmap 进行进一步优化;不过如果每张图像具有不同的内参,自动估计大概率会失败。
  • SIMPLE_RADIAL_FISHEYE, RADIAL_FISHEYE, OPENCV_FISHEYE, FOV,THIN_PRISM_FISHEYE:适用于鱼眼镜头,同时所有其他的模型都不能真正地建模鱼眼镜头的畸变。其中 FOV 被 Google Tango 项目采用(必须确保不要将 omega 初始化为 0)

图像特征匹配

colmap exhaustive_matcher --database_path database.db  --SiftMatching.use_gpu 1

   
AI写代码 python
运行
  • 1
  • exhaustive_matcher:针对少量图像(几百张量级),可以获得足够快且最好的重建结果。它将每张图像与其余所有图像进行匹配,不过
    block size 可能限制同时加载到内存中的图像数量。
  • sequential_matcher:针对顺序采集的视频图像,由于相邻帧存在视觉上的重叠且没有必要进行完全匹配,它只匹配视频流中的相邻帧。同时,这种匹配方式能够基于
    vocabulary tree 进行回环检测。最后,帧之间的前后关系由图像文件名给定,与数据集中的存储顺序无关。
  • vocab_tree_matcher:针对大量图像(几千帧量级),可以通过提供 vocabulary tree
    从而快速检索视觉上最相近的图像进行匹配。
  • spatial_matcher:针对能够提供准确定位信息的图像,可以通过对应图像采集时的 GPS 信息从而仅匹配空间位置上相近的图像。
  • transitive_matcher:基于传递规则使用已有的特征匹配关系确定更完全的匹配图,即 A 与 B 匹配,B 与 C
    匹配,那将直接匹配 A 和 C。
  • Custom Matching:通过 text 文件指定图像的匹配关系,如果是导入的特征可以进一步指定两张图像之间特征的匹配关系。

相机位姿求解与优化

mkdir sparse
colmap mapper --database_path database.db --image_path images --output_path sparse --Mapper.ba_refine_principal_point true

   
AI写代码 python
运行
  • 1
  • 2

开启 ba_refine_principal_point 选项意味着在束调整过程中,colmap 会尝试找到最佳的主点位置,以最小化重投影误差,即最小化观测到的特征点位置与从相机模型计算出的特征点位置之间的差异。这对于提高最终重建的精度是非常有帮助的,尤其是在使用具有显著畸变或非标准相机参数的图像时。

需要注意的是,开启这个选项可能会增加计算的复杂度,因为需要额外优化一个参数,所以运行时间可能会更长。然而,对于追求高精度重建的应用来说,这是一个值得考虑的选项。

colmap 代码

import os
import collections
import numpy as np
import struct
import argparse

CameraModel = collections.namedtuple(
“CameraModel”, [“model_id”, “model_name”, “num_params”])
Camera = collections.namedtuple(
“Camera”, [“id”, “model”, “width”, “height”, “params”])
BaseImage = collections.namedtuple(
“Image”, [“id”, “qvec”, “tvec”, “camera_id”, “name”, “xys”, “point3D_ids”])
Point3D = collections.namedtuple(
“Point3D”, [“id”, “xyz”, “rgb”, “error”, “image_ids”, “point2D_idxs”])

class Image(BaseImage):
def qvec2rotmat(self):
return qvec2rotmat(self.qvec)

CAMERA_MODELS = {
CameraModel(model_id=0, model_name=“SIMPLE_PINHOLE”, num_params=3),
CameraModel(model_id=1, model_name=“PINHOLE”, num_params=4),
CameraModel(model_id=2, model_name=“SIMPLE_RADIAL”, num_params=4),
CameraModel(model_id=3, model_name=“RADIAL”, num_params=5),
CameraModel(model_id=4, model_name=“OPENCV”, num_params=8),
CameraModel(model_id=5, model_name=“OPENCV_FISHEYE”, num_params=8),
CameraModel(model_id=6, model_name=“FULL_OPENCV”, num_params=12),
CameraModel(model_id=7, model_name=“FOV”, num_params=5),
CameraModel(model_id=8, model_name=“SIMPLE_RADIAL_FISHEYE”, num_params=4),
CameraModel(model_id=9, model_name=“RADIAL_FISHEYE”, num_params=5),
CameraModel(model_id=10, model_name=“THIN_PRISM_FISHEYE”, num_params=12)
}
CAMERA_MODEL_IDS = dict([(camera_model.model_id, camera_model)
for camera_model in CAMERA_MODELS])
CAMERA_MODEL_NAMES = dict([(camera_model.model_name, camera_model)
for camera_model in CAMERA_MODELS])

def read_next_bytes(fid, num_bytes, format_char_sequence, endian_character=“<”):
“”“Read and unpack the next bytes from a binary file.
:param fid:
:param num_bytes: Sum of combination of {2, 4, 8}, e.g. 2, 6, 16, 30, etc.
:param format_char_sequence: List of {c, e, f, d, h, H, i, I, l, L, q, Q}.
:param endian_character: Any of {@, =, <, >, !}
:return: Tuple of read and unpacked values.
“””

data = fid.read(num_bytes)
return struct.unpack(endian_character + format_char_sequence, data)

def write_next_bytes(fid, data, format_char_sequence, endian_character=“<”):
“”“pack and write to a binary file.
:param fid:
:param data: data to send, if multiple elements are sent at the same time,
they should be encapsuled either in a list or a tuple
:param format_char_sequence: List of {c, e, f, d, h, H, i, I, l, L, q, Q}.
should be the same length as the data list or tuple
:param endian_character: Any of {@, =, <, >, !}
“””

if isinstance(data, (list, tuple)):
bytes = struct.pack(endian_character + format_char_sequence, *data)
else:
bytes = struct.pack(endian_character + format_char_sequence, data)
fid.write(bytes)

def read_cameras_text(path):
“”"
see: src/base/reconstruction.cc
void Reconstruction::WriteCamerasText(const std::string& path)
void Reconstruction::ReadCamerasText(const std::string& path)
“”“

cameras = { }
with open(path, “r”) as fid:
while True:
line = fid.readline()
if not line:
break
line = line.strip()
if len(line) > 0 and line[0] != ”#":
elems = line.split()
camera_id = int(elems[0])
model = elems[1]
width = int(elems[2])
height = int(elems[3])
params = np.array(tuple(map(float, elems[4:])))
cameras[camera_id] = Camera(id=camera_id, model=model,
width=width, height=height,
params=params)
return cameras

def read_cameras_binary(path_to_model_file):
“”"
see: src/base/reconstruction.cc
void Reconstruction::WriteCamerasBinary(const std::string& path)
void Reconstruction::ReadCamerasBinary(const std::string& path)
“”"

cameras = { }
with open(path_to_model_file, “rb”) as fid:
num_cameras = read_next_bytes(fid, 8, “Q”)[0]
for _ in range(num_cameras):
camera_properties = read_next_bytes(
fid, num_bytes=24, format_char_sequence=“iiQQ”)
camera_id = camera_properties[0]
model_id = camera_properties[1]
model_name = CAMERA_MODEL_IDS[camera_properties[1]].model_name
width = camera_properties[2]
height = camera_properties[3]
num_params = CAMERA_MODEL_IDS[model_id].num_params
params = read_next_bytes(fid, num_bytes=8num_params,
format_char_sequence=“d”num_params)
cameras[camera_id] = Camera(id=camera_id,
model=model_name,
width=width,
height=height,
params=np.array(params))
assert len(cameras) == num_cameras
return cameras

def write_cameras_text(cameras, path):
“”"
see: src/base/reconstruction.cc
void Reconstruction::WriteCamerasText(const std::string& path)
void Reconstruction::ReadCamerasText(const std::string& path)
“”“

HEADER = ”# Camera list with one line of data per camera:\n" +
“# CAMERA_ID, MODEL, WIDTH, HEIGHT, PARAMS[]\n” +
“# Number of cameras: {}\n”.format(len(cameras))
with open(path, “w”) as fid:
fid.write(HEADER)
for _, cam in cameras.items():
to_write = [cam.id, cam.model, cam.width, cam.height, *cam.params]
line = " “.join([str(elem) for elem in to_write])
fid.write(line + ”\n")

def write_cameras_binary(cameras, path_to_model_file):
“”"
see: src/base/reconstruction.cc
void Reconstruction::WriteCamerasBinary(const std::string& path)
void Reconstruction::ReadCamerasBinary(const std::string& path)
“”"

with open(path_to_model_file, “wb”) as fid:
write_next_bytes(fid, len(cameras), “Q”)
for _, cam in cameras.items():
model_id = CAMERA_MODEL_NAMES[cam.model].model_id
camera_properties = [cam.id,
model_id,
cam.width,
cam.height]
write_next_bytes(fid, camera_properties, “iiQQ”)
for p in cam.params:
write_next_bytes(fid, float(p), “d”)
return cameras

def read_images_text(path):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadImagesText(const std::string& path)
void Reconstruction::WriteImagesText(const std::string& path)
“”“

images = { }
with open(path, “r”) as fid:
while True:
line = fid.readline()
if not line:
break
line = line.strip()
if len(line) > 0 and line[0] != ”#":
elems = line.split()
image_id = int(elems[0])
qvec = np.array(tuple(map(float, elems[1:5])))
tvec = np.array(tuple(map(float, elems[5:8])))
camera_id = int(elems[8])
image_name = elems[9]
elems = fid.readline().split()
xys = np.column_stack([tuple(map(float, elems[0::3])),
tuple(map(float, elems[1::3]))])
point3D_ids = np.array(tuple(map(int, elems[2::3])))
images[image_id] = Image(
id=image_id, qvec=qvec, tvec=tvec,
camera_id=camera_id, name=image_name,
xys=xys, point3D_ids=point3D_ids)
return images

def read_images_binary(path_to_model_file):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadImagesBinary(const std::string& path)
void Reconstruction::WriteImagesBinary(const std::string& path)
“”“

images = { }
with open(path_to_model_file, “rb”) as fid:
num_reg_images = read_next_bytes(fid, 8, “Q”)[0]
for _ in range(num_reg_images):
binary_image_properties = read_next_bytes(
fid, num_bytes=64, format_char_sequence=“idddddddi”)
image_id = binary_image_properties[0]
qvec = np.array(binary_image_properties[1:5])
tvec = np.array(binary_image_properties[5:8])
camera_id = binary_image_properties[8]
image_name = ”“
current_char = read_next_bytes(fid, 1, “c”)[0]
while current_char != b”\x00": # look for the ASCII 0 entry
image_name += current_char.decode(“utf-8”)
current_char = read_next_bytes(fid, 1, “c”)[0]
num_points2D = read_next_bytes(fid, num_bytes=8,
format_char_sequence=“Q”)[0]
x_y_id_s = read_next_bytes(fid, num_bytes=24num_points2D,
format_char_sequence=“ddq”num_points2D)
xys = np.column_stack([tuple(map(float, x_y_id_s[0::3])),
tuple(map(float, x_y_id_s[1::3]))])
point3D_ids = np.array(tuple(map(int, x_y_id_s[2::3])))
images[image_id] = Image(
id=image_id, qvec=qvec, tvec=tvec,
camera_id=camera_id, name=image_name,
xys=xys, point3D_ids=point3D_ids)

<span class="token keyword">return</span> images

def write_images_text(images, path):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadImagesText(const std::string& path)
void Reconstruction::WriteImagesText(const std::string& path)
“”“

if len(images) == 0:
mean_observations = 0
else:
mean_observations = sum((len(img.point3D_ids) for _, img in images.items()))/len(images)
HEADER = ”# Image list with two lines of data per image:\n" +
“# IMAGE_ID, QW, QX, QY, QZ, TX, TY, TZ, CAMERA_ID, NAME\n” +
“# POINTS2D[] as (X, Y, POINT3D_ID)\n” +
“# Number of images: {}, mean observations per image: {}\n”.format(len(images), mean_observations)

<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> fid<span class="token punctuation">:</span>
    fid<span class="token punctuation">.</span>write<span class="token punctuation">(</span>HEADER<span class="token punctuation">)</span>
    <span class="token keyword">for</span> _<span class="token punctuation">,</span> img <span class="token keyword">in</span> images<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
        image_header <span class="token operator">=</span> <span class="token punctuation">[</span>img<span class="token punctuation">.</span><span class="token builtin">id</span><span class="token punctuation">,</span> <span class="token operator">*</span>img<span class="token punctuation">.</span>qvec<span class="token punctuation">,</span> <span class="token operator">*</span>img<span class="token punctuation">.</span>tvec<span class="token punctuation">,</span> img<span class="token punctuation">.</span>camera_id<span class="token punctuation">,</span> img<span class="token punctuation">.</span>name<span class="token punctuation">]</span>
        first_line <span class="token operator">=</span> <span class="token string">" "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token builtin">map</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">,</span> image_header<span class="token punctuation">)</span><span class="token punctuation">)</span>
        fid<span class="token punctuation">.</span>write<span class="token punctuation">(</span>first_line <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">)</span>

        points_strings <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token keyword">for</span> xy<span class="token punctuation">,</span> point3D_id <span class="token keyword">in</span> <span class="token builtin">zip</span><span class="token punctuation">(</span>img<span class="token punctuation">.</span>xys<span class="token punctuation">,</span> img<span class="token punctuation">.</span>point3D_ids<span class="token punctuation">)</span><span class="token punctuation">:</span>
            points_strings<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token builtin">map</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">,</span> <span class="token punctuation">[</span><span class="token operator">*</span>xy<span class="token punctuation">,</span> point3D_id<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        fid<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>points_strings<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">)</span>

def write_images_binary(images, path_to_model_file):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadImagesBinary(const std::string& path)
void Reconstruction::WriteImagesBinary(const std::string& path)
“”“

with open(path_to_model_file, “wb”) as fid:
write_next_bytes(fid, len(images), “Q”)
for _, img in images.items():
write_next_bytes(fid, img.id, “i”)
write_next_bytes(fid, img.qvec.tolist(), “dddd”)
write_next_bytes(fid, img.tvec.tolist(), “ddd”)
write_next_bytes(fid, img.camera_id, “i”)
for char in img.name:
write_next_bytes(fid, char.encode(“utf-8”), “c”)
write_next_bytes(fid, b”\x00", “c”)
write_next_bytes(fid, len(img.point3D_ids), “Q”)
for xy, p3d_id in zip(img.xys, img.point3D_ids):
write_next_bytes(fid, [*xy, p3d_id], “ddq”)

def read_points3D_text(path):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadPoints3DText(const std::string& path)
void Reconstruction::WritePoints3DText(const std::string& path)
“”“

points3D = { }
with open(path, “r”) as fid:
while True:
line = fid.readline()
if not line:
break
line = line.strip()
if len(line) > 0 and line[0] != ”#":
elems = line.split()
point3D_id = int(elems[0])
xyz = np.array(tuple(map(float, elems[1:4])))
rgb = np.array(tuple(map(int, elems[4:7])))
error = float(elems[7])
image_ids = np.array(tuple(map(int, elems[8::2])))
point2D_idxs = np.array(tuple(map(int, elems[9::2])))
points3D[point3D_id] = Point3D(id=point3D_id, xyz=xyz, rgb=rgb,
error=error, image_ids=image_ids,
point2D_idxs=point2D_idxs)
return points3D

def read_points3D_binary(path_to_model_file):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadPoints3DBinary(const std::string& path)
void Reconstruction::WritePoints3DBinary(const std::string& path)
“”"

points3D = { }
with open(path_to_model_file, “rb”) as fid:
num_points = read_next_bytes(fid, 8, “Q”)[0]
for _ in range(num_points):
binary_point_line_properties = read_next_bytes(
fid, num_bytes=43, format_char_sequence=“QdddBBBd”)
point3D_id = binary_point_line_properties[0]
xyz = np.array(binary_point_line_properties[1:4])
rgb = np.array(binary_point_line_properties[4:7])
error = np.array(binary_point_line_properties[7])
track_length = read_next_bytes(
fid, num_bytes=8, format_char_sequence=“Q”)[0]
track_elems = read_next_bytes(
fid, num_bytes=8track_length,
format_char_sequence=“ii”track_length)
image_ids = np.array(tuple(map(int, track_elems[0::2])))
point2D_idxs = np.array(tuple(map(int, track_elems[1::2])))
points3D[point3D_id] = Point3D(
id=point3D_id, xyz=xyz, rgb=rgb,
error=error, image_ids=image_ids,
point2D_idxs=point2D_idxs)
return points3D

def write_points3D_text(points3D, path):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadPoints3DText(const std::string& path)
void Reconstruction::WritePoints3DText(const std::string& path)
“”“

if len(points3D) == 0:
mean_track_length = 0
else:
mean_track_length = sum((len(pt.image_ids) for _, pt in points3D.items()))/len(points3D)
HEADER = ”# 3D point list with one line of data per point:\n" +
“# POINT3D_ID, X, Y, Z, R, G, B, ERROR, TRACK[] as (IMAGE_ID, POINT2D_IDX)\n” +
“# Number of points: {}, mean track length: {}\n”.format(len(points3D), mean_track_length)

<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"w"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> fid<span class="token punctuation">:</span>
    fid<span class="token punctuation">.</span>write<span class="token punctuation">(</span>HEADER<span class="token punctuation">)</span>
    <span class="token keyword">for</span> _<span class="token punctuation">,</span> pt <span class="token keyword">in</span> points3D<span class="token punctuation">.</span>items<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">:</span>
        point_header <span class="token operator">=</span> <span class="token punctuation">[</span>pt<span class="token punctuation">.</span><span class="token builtin">id</span><span class="token punctuation">,</span> <span class="token operator">*</span>pt<span class="token punctuation">.</span>xyz<span class="token punctuation">,</span> <span class="token operator">*</span>pt<span class="token punctuation">.</span>rgb<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>error<span class="token punctuation">]</span>
        fid<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token builtin">map</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">,</span> point_header<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">" "</span><span class="token punctuation">)</span>
        track_strings <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span>
        <span class="token keyword">for</span> image_id<span class="token punctuation">,</span> point2D <span class="token keyword">in</span> <span class="token builtin">zip</span><span class="token punctuation">(</span>pt<span class="token punctuation">.</span>image_ids<span class="token punctuation">,</span> pt<span class="token punctuation">.</span>point2D_idxs<span class="token punctuation">)</span><span class="token punctuation">:</span>
            track_strings<span class="token punctuation">.</span>append<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span><span class="token builtin">map</span><span class="token punctuation">(</span><span class="token builtin">str</span><span class="token punctuation">,</span> <span class="token punctuation">[</span>image_id<span class="token punctuation">,</span> point2D<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        fid<span class="token punctuation">.</span>write<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">.</span>join<span class="token punctuation">(</span>track_strings<span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"\n"</span><span class="token punctuation">)</span>

def write_points3D_binary(points3D, path_to_model_file):
“”"
see: src/base/reconstruction.cc
void Reconstruction::ReadPoints3DBinary(const std::string& path)
void Reconstruction::WritePoints3DBinary(const std::string& path)
“”"

with open(path_to_model_file, “wb”) as fid:
write_next_bytes(fid, len(points3D), “Q”)
for _, pt in points3D.items():
write_next_bytes(fid, pt.id, “Q”)
write_next_bytes(fid, pt.xyz.tolist(), “ddd”)
write_next_bytes(fid, pt.rgb.tolist(), “BBB”)
write_next_bytes(fid, pt.error, “d”)
track_length = pt.image_ids.shape[0]
write_next_bytes(fid, track_length, “Q”)
for image_id, point2D_id in zip(pt.image_ids, pt.point2D_idxs):
write_next_bytes(fid, [image_id, point2D_id], “ii”)

def detect_model_format(path, ext):
if os.path.isfile(os.path.join(path, “cameras” + ext)) and
os.path.isfile(os.path.join(path, “images” + ext)) and
os.path.isfile(os.path.join(path, “points3D” + ext)):
print(“Detected model format: '” + ext + “'”)
return True

<span class="token keyword">return</span> <span class="token boolean">False</span>

def read_model(path, ext=“”):
# try to detect the extension automatically
if ext == “”:
if detect_model_format(path, “.bin”):
ext = “.bin”
elif detect_model_format(path, “.txt”):
ext = “.txt”
else:
print(“Provide model format: ‘.bin’ or ‘.txt’”)
return

<span class="token keyword">if</span> ext <span class="token operator">==</span> <span class="token string">".txt"</span><span class="token punctuation">:</span>
    cameras <span class="token operator">=</span> read_cameras_text<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"cameras"</span> <span class="token operator">+</span> ext<span class="token punctuation">)</span><span class="token punctuation">)</span>
    images <span class="token operator">=</span> read_images_text<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"images"</span> <span class="token operator">+</span> ext<span class="token punctuation">)</span><span class="token punctuation">)</span>
    points3D <span class="token operator">=</span> read_points3D_text<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"points3D"</span><span class="token punctuation">)</span> <span class="token operator">+</span> ext<span class="token punctuation">)</span>
<span class="token keyword">else</span><span class="token punctuation">:</span>
    cameras <span class="token operator">=</span> read_cameras_binary<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"cameras"</span> <span class="token operator">+</span> ext<span class="token punctuation">)</span><span class="token punctuation">)</span>
    images <span class="token operator">=</span> read_images_binary<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"images"</span> <span class="token operator">+</span> ext<span class="token punctuation">)</span><span class="token punctuation">)</span>
    points3D <span class="token operator">=</span> read_points3D_binary<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>path<span class="token punctuation">,</span> <span class="token string">"points3D"</span><span class="token punctuation">)</span> <span class="token operator">+</span> ext<span class="token punctuation">)</span>
<span class="token keyword">return</span> cameras<span class="token punctuation">,</span> images<span class="token punctuation">,</span> points3D

def write_model(cameras, images, points3D, path, ext=“.bin”):
if ext == “.txt”:
write_cameras_text(cameras, os.path.join(path, “cameras” + ext))
write_images_text(images, os.path.join(path, “images” + ext))
write_points3D_text(points3D, os.path.join(path, “points3D”) + ext)
else:
write_cameras_binary(cameras, os.path.join(path, “cameras” + ext))
write_images_binary(images, os.path.join(path, “images” + ext))
write_points3D_binary(points3D, os.path.join(path, “points3D”) + ext)
return cameras, images, points3D

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] < 0:
qvec *= -1
return qvec

def main():
parser = argparse.ArgumentParser(description=“Read and write COLMAP binary and text models”)
parser.add_argument(“–input_model”, help=“path to input model folder”)
parser.add_argument(“–input_format”, choices=[“.bin”, “.txt”],
help=“input model format”, default=“”)
parser.add_argument(“–output_model”,
help=“path to output model folder”)
parser.add_argument(“–output_format”, choices=[“.bin”, “.txt”],
help=“outut model format”, default=“.txt”)
args = parser.parse_args()

cameras<span class="token punctuation">,</span> images<span class="token punctuation">,</span> points3D <span class="token operator">=</span> read_model<span class="token punctuation">(</span>path<span class="token operator">=</span>args<span class="token punctuation">.</span>input_model<span class="token punctuation">,</span> ext<span class="token operator">=</span>args<span class="token punctuation">.</span>input_format<span class="token punctuation">)</span>

<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"num_cameras:"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>cameras<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"num_images:"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>images<span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"num_points3D:"</span><span class="token punctuation">,</span> <span class="token builtin">len</span><span class="token punctuation">(</span>points3D<span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token keyword">if</span> args<span class="token punctuation">.</span>output_model <span class="token keyword">is</span> <span class="token keyword">not</span> <span class="token boolean">None</span><span class="token punctuation">:</span>
    write_model<span class="token punctuation">(</span>cameras<span class="token punctuation">,</span> images<span class="token punctuation">,</span> points3D<span class="token punctuation">,</span> path<span class="token operator">=</span>args<span class="token punctuation">.</span>output_model<span class="token punctuation">,</span> ext<span class="token operator">=</span>args<span class="token punctuation">.</span>output_format<span class="token punctuation">)</span>

if name == main:
main()

colmap2nerf

#!/usr/bin/env python3

# Copyright © 2020-2022, NVIDIA CORPORATION. All rights reserved.
#
# NVIDIA CORPORATION and its licensors retain all intellectual property
# and proprietary rights in and to this software, related documentation
# and any modifications thereto. Any use, reproduction, disclosure or
# distribution of this software and related documentation without an express
# license agreement from NVIDIA CORPORATION is strictly prohibited.

import argparse
from glob import glob
import os
from pathlib import Path, PurePosixPath

import numpy as np
import json
import sys
import math
import cv2
import os
import shutil

ROOT_DIR = os.path.dirname(os.path.dirname(os.path.realpath(file)))
SCRIPTS_FOLDER = os.path.join(ROOT_DIR, “scripts”)

def parse_args():
parser = argparse.ArgumentParser(
description=“Convert a text colmap export to nerf format transforms.json; optionally convert video to images, and optionally run colmap in the first place.”)

parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--video_in"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Run ffmpeg first to convert a provided video file into a set of images. Uses the video_fps parameter also."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--video_fps"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token number">2</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--time_slice"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Time (in seconds) in the format t1,t2 within which the images should be generated from the video. E.g.: \"--time_slice '10,300'\" will generate images only from 10th second to 300th second of the video."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--run_colmap"</span><span class="token punctuation">,</span> action<span class="token operator">=</span><span class="token string">"store_true"</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"run colmap first on the image folder"</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--colmap_matcher"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">"sequential"</span><span class="token punctuation">,</span>
                    choices<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"exhaustive"</span><span class="token punctuation">,</span> <span class="token string">"sequential"</span><span class="token punctuation">,</span> <span class="token string">"spatial"</span><span class="token punctuation">,</span> <span class="token string">"transitive"</span><span class="token punctuation">,</span> <span class="token string">"vocab_tree"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Select which matcher colmap should use. Sequential for videos, exhaustive for ad-hoc images."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--colmap_db"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">"colmap.db"</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"colmap database filename"</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--colmap_camera_model"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">"OPENCV"</span><span class="token punctuation">,</span>
                    choices<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"SIMPLE_PINHOLE"</span><span class="token punctuation">,</span> <span class="token string">"PINHOLE"</span><span class="token punctuation">,</span> <span class="token string">"SIMPLE_RADIAL"</span><span class="token punctuation">,</span> <span class="token string">"RADIAL"</span><span class="token punctuation">,</span> <span class="token string">"OPENCV"</span><span class="token punctuation">,</span>
                             <span class="token string">"SIMPLE_RADIAL_FISHEYE"</span><span class="token punctuation">,</span> <span class="token string">"RADIAL_FISHEYE"</span><span class="token punctuation">,</span> <span class="token string">"OPENCV_FISHEYE"</span><span class="token punctuation">]</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Camera model"</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--colmap_camera_params"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Intrinsic parameters, depending on the chosen model. Format: fx,fy,cx,cy,dist"</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--images"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">"images"</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Input path to the images."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--text"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">"colmap_text"</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Input path to the colmap text files (set automatically if --run_colmap is used)."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--aabb_scale"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token number">32</span><span class="token punctuation">,</span> choices<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">"1"</span><span class="token punctuation">,</span> <span class="token string">"2"</span><span class="token punctuation">,</span> <span class="token string">"4"</span><span class="token punctuation">,</span> <span class="token string">"8"</span><span class="token punctuation">,</span> <span class="token string">"16"</span><span class="token punctuation">,</span> <span class="token string">"32"</span><span class="token punctuation">,</span> <span class="token string">"64"</span><span class="token punctuation">,</span> <span class="token string">"128"</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Large scene scale factor. 1=scene fits in unit cube; power of 2 up to 128"</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--skip_early"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token number">0</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Skip this many images from the start."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--keep_colmap_coords"</span><span class="token punctuation">,</span> action<span class="token operator">=</span><span class="token string">"store_true"</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Keep transforms.json in COLMAP's original frame of reference (this will avoid reorienting and repositioning the scene for preview and rendering)."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--out"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">"transforms.json"</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Output JSON file path."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--vocab_path"</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token string">""</span><span class="token punctuation">,</span> <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Vocabulary tree path."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--overwrite"</span><span class="token punctuation">,</span> action<span class="token operator">=</span><span class="token string">"store_true"</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Do not ask for confirmation for overwriting existing images and COLMAP data."</span><span class="token punctuation">)</span>
parser<span class="token punctuation">.</span>add_argument<span class="token punctuation">(</span><span class="token string">"--mask_categories"</span><span class="token punctuation">,</span> nargs<span class="token operator">=</span><span class="token string">"*"</span><span class="token punctuation">,</span> <span class="token builtin">type</span><span class="token operator">=</span><span class="token builtin">str</span><span class="token punctuation">,</span> default<span class="token operator">=</span><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
                    <span class="token builtin">help</span><span class="token operator">=</span><span class="token string">"Object categories that should be masked out from the training images. See `scripts/category2id.json` for supported categories."</span><span class="token punctuation">)</span>
args <span class="token operator">=</span> parser<span class="token punctuation">.</span>parse_args<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">return</span> args

def do_system(arg):
print(f"==== running: { arg}")
err = os.system(arg)
if err:
print(“FATAL: command failed”)
sys.exit(err)

def run_ffmpeg(args):
ffmpeg_binary = “ffmpeg”

<span class="token comment"># On Windows, if FFmpeg isn't found, try automatically downloading it from the internet</span>
<span class="token keyword">if</span> os<span class="token punctuation">.</span>name <span class="token operator">==</span> <span class="token string">"nt"</span> <span class="token keyword">and</span> os<span class="token punctuation">.</span>system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"where </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>ffmpeg_binary<span class="token punctuation">}</span></span><span class="token string"> &gt;nul 2&gt;nul"</span></span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">:</span>
    ffmpeg_glob <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>ROOT_DIR<span class="token punctuation">,</span> <span class="token string">"external"</span><span class="token punctuation">,</span> <span class="token string">"ffmpeg"</span><span class="token punctuation">,</span> <span class="token string">"*"</span><span class="token punctuation">,</span> <span class="token string">"bin"</span><span class="token punctuation">,</span> <span class="token string">"ffmpeg.exe"</span><span class="token punctuation">)</span>
    candidates <span class="token operator">=</span> glob<span class="token punctuation">(</span>ffmpeg_glob<span class="token punctuation">)</span>
    <span class="token keyword">if</span> <span class="token keyword">not</span> candidates<span class="token punctuation">:</span>
        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"FFmpeg not found. Attempting to download FFmpeg from the internet."</span><span class="token punctuation">)</span>
        do_system<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>SCRIPTS_FOLDER<span class="token punctuation">,</span> <span class="token string">"download_ffmpeg.bat"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        candidates <span class="token operator">=</span> glob<span class="token punctuation">(</span>ffmpeg_glob<span class="token punctuation">)</span>

    <span class="token keyword">if</span> candidates<span class="token punctuation">:</span>
        ffmpeg_binary <span class="token operator">=</span> candidates<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>

<span class="token keyword">if</span> <span class="token keyword">not</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>isabs<span class="token punctuation">(</span>args<span class="token punctuation">.</span>images<span class="token punctuation">)</span><span class="token punctuation">:</span>
    args<span class="token punctuation">.</span>images <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>dirname<span class="token punctuation">(</span>args<span class="token punctuation">.</span>video_in<span class="token punctuation">)</span><span class="token punctuation">,</span> args<span class="token punctuation">.</span>images<span class="token punctuation">)</span>

images <span class="token operator">=</span> <span class="token string">"\""</span> <span class="token operator">+</span> args<span class="token punctuation">.</span>images <span class="token operator">+</span> <span class="token string">"\""</span>
video <span class="token operator">=</span> <span class="token string">"\""</span> <span class="token operator">+</span> args<span class="token punctuation">.</span>video_in <span class="token operator">+</span> <span class="token string">"\""</span>
fps <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>args<span class="token punctuation">.</span>video_fps<span class="token punctuation">)</span> <span class="token keyword">or</span> <span class="token number">1.0</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"running ffmpeg with input video file=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>video<span class="token punctuation">}</span></span><span class="token string">, output image folder=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string">, fps=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>fps<span class="token punctuation">}</span></span><span class="token string">."</span></span><span class="token punctuation">)</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> args<span class="token punctuation">.</span>overwrite <span class="token keyword">and</span> <span class="token punctuation">(</span>
                                  <span class="token builtin">input</span><span class="token punctuation">(</span>
                                      <span class="token string-interpolation"><span class="token string">f"warning! folder '</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string">' will be deleted/replaced. continue? (Y/n)"</span></span><span class="token punctuation">)</span><span class="token punctuation">.</span>lower<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"y"</span><span class="token punctuation">)</span><span class="token punctuation">[</span>
                          <span class="token punctuation">:</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string">"y"</span><span class="token punctuation">:</span>
    sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token keyword">try</span><span class="token punctuation">:</span>
    <span class="token comment"># Passing Images' Path Without Double Quotes</span>
    shutil<span class="token punctuation">.</span>rmtree<span class="token punctuation">(</span>args<span class="token punctuation">.</span>images<span class="token punctuation">)</span>
<span class="token keyword">except</span><span class="token punctuation">:</span>
    <span class="token keyword">pass</span>
do_system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"mkdir </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>

time_slice_value <span class="token operator">=</span> <span class="token string">""</span>
time_slice <span class="token operator">=</span> args<span class="token punctuation">.</span>time_slice
<span class="token keyword">if</span> time_slice<span class="token punctuation">:</span>
    start<span class="token punctuation">,</span> end <span class="token operator">=</span> time_slice<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">","</span><span class="token punctuation">)</span>
    time_slice_value <span class="token operator">=</span> <span class="token string-interpolation"><span class="token string">f",select='between(t\,</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>start<span class="token punctuation">}</span></span><span class="token string">\,</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>end<span class="token punctuation">}</span></span><span class="token string">)'"</span></span>
do_system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>ffmpeg_binary<span class="token punctuation">}</span></span><span class="token string"> -i </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>video<span class="token punctuation">}</span></span><span class="token string"> -qscale:v 1 -qmin 1 -vf \"fps=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>fps<span class="token punctuation">}</span></span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>time_slice_value<span class="token punctuation">}</span></span><span class="token string">\" </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string">/%04d.jpg"</span></span><span class="token punctuation">)</span>

def run_colmap(args):
colmap_binary = “colmap”

<span class="token comment"># On Windows, if FFmpeg isn't found, try automatically downloading it from the internet</span>
<span class="token keyword">if</span> os<span class="token punctuation">.</span>name <span class="token operator">==</span> <span class="token string">"nt"</span> <span class="token keyword">and</span> os<span class="token punctuation">.</span>system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"where </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>colmap_binary<span class="token punctuation">}</span></span><span class="token string"> &gt;nul 2&gt;nul"</span></span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token number">0</span><span class="token punctuation">:</span>
    colmap_glob <span class="token operator">=</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>ROOT_DIR<span class="token punctuation">,</span> <span class="token string">"external"</span><span class="token punctuation">,</span> <span class="token string">"colmap"</span><span class="token punctuation">,</span> <span class="token string">"*"</span><span class="token punctuation">,</span> <span class="token string">"COLMAP.bat"</span><span class="token punctuation">)</span>
    candidates <span class="token operator">=</span> glob<span class="token punctuation">(</span>colmap_glob<span class="token punctuation">)</span>
    <span class="token keyword">if</span> <span class="token keyword">not</span> candidates<span class="token punctuation">:</span>
        <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string">"COLMAP not found. Attempting to download COLMAP from the internet."</span><span class="token punctuation">)</span>
        do_system<span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>SCRIPTS_FOLDER<span class="token punctuation">,</span> <span class="token string">"download_colmap.bat"</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
        candidates <span class="token operator">=</span> glob<span class="token punctuation">(</span>colmap_glob<span class="token punctuation">)</span>

    <span class="token keyword">if</span> candidates<span class="token punctuation">:</span>
        colmap_binary <span class="token operator">=</span> candidates<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span>

db <span class="token operator">=</span> args<span class="token punctuation">.</span>colmap_db
images <span class="token operator">=</span> <span class="token string">"\""</span> <span class="token operator">+</span> args<span class="token punctuation">.</span>images <span class="token operator">+</span> <span class="token string">"\""</span>
db_noext <span class="token operator">=</span> <span class="token builtin">str</span><span class="token punctuation">(</span>Path<span class="token punctuation">(</span>db<span class="token punctuation">)</span><span class="token punctuation">.</span>with_suffix<span class="token punctuation">(</span><span class="token string">""</span><span class="token punctuation">)</span><span class="token punctuation">)</span>

<span class="token keyword">if</span> args<span class="token punctuation">.</span>text <span class="token operator">==</span> <span class="token string">"text"</span><span class="token punctuation">:</span>
    args<span class="token punctuation">.</span>text <span class="token operator">=</span> db_noext <span class="token operator">+</span> <span class="token string">"_text"</span>
text <span class="token operator">=</span> args<span class="token punctuation">.</span>text
sparse <span class="token operator">=</span> db_noext <span class="token operator">+</span> <span class="token string">"_sparse"</span>
<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"running colmap with:\n\tdb=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>db<span class="token punctuation">}</span></span><span class="token string">\n\timages=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string">\n\tsparse=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">\n\ttext=</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>text<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
<span class="token keyword">if</span> <span class="token keyword">not</span> args<span class="token punctuation">.</span>overwrite <span class="token keyword">and</span> <span class="token punctuation">(</span>
                                  <span class="token builtin">input</span><span class="token punctuation">(</span>
                                      <span class="token string-interpolation"><span class="token string">f"warning! folders '</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">' and '</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>text<span class="token punctuation">}</span></span><span class="token string">' will be deleted/replaced. continue? (Y/n)"</span></span><span class="token punctuation">)</span><span class="token punctuation">.</span>lower<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>strip<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token string">"y"</span><span class="token punctuation">)</span><span class="token punctuation">[</span>
                          <span class="token punctuation">:</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">!=</span> <span class="token string">"y"</span><span class="token punctuation">:</span>
    sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>
<span class="token keyword">if</span> os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>exists<span class="token punctuation">(</span>db<span class="token punctuation">)</span><span class="token punctuation">:</span>
    os<span class="token punctuation">.</span>remove<span class="token punctuation">(</span>db<span class="token punctuation">)</span>
do_system<span class="token punctuation">(</span>
    <span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>colmap_binary<span class="token punctuation">}</span></span><span class="token string"> feature_extractor --ImageReader.camera_model </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>args<span class="token punctuation">.</span>colmap_camera_model<span class="token punctuation">}</span></span><span class="token string"> --ImageReader.camera_params \"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>args<span class="token punctuation">.</span>colmap_camera_params<span class="token punctuation">}</span></span><span class="token string">\" --SiftExtraction.estimate_affine_shape=true --SiftExtraction.domain_size_pooling=true --ImageReader.single_camera 1 --database_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>db<span class="token punctuation">}</span></span><span class="token string"> --image_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
match_cmd <span class="token operator">=</span> <span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>colmap_binary<span class="token punctuation">}</span></span><span class="token string"> </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>args<span class="token punctuation">.</span>colmap_matcher<span class="token punctuation">}</span></span><span class="token string">_matcher --SiftMatching.guided_matching=true --database_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>db<span class="token punctuation">}</span></span><span class="token string">"</span></span>
<span class="token keyword">if</span> args<span class="token punctuation">.</span>vocab_path<span class="token punctuation">:</span>
    match_cmd <span class="token operator">+=</span> <span class="token string-interpolation"><span class="token string">f" --VocabTreeMatching.vocab_tree_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>args<span class="token punctuation">.</span>vocab_path<span class="token punctuation">}</span></span><span class="token string">"</span></span>
do_system<span class="token punctuation">(</span>match_cmd<span class="token punctuation">)</span>
<span class="token keyword">try</span><span class="token punctuation">:</span>
    shutil<span class="token punctuation">.</span>rmtree<span class="token punctuation">(</span>sparse<span class="token punctuation">)</span>
<span class="token keyword">except</span><span class="token punctuation">:</span>
    <span class="token keyword">pass</span>
do_system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"mkdir </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
do_system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>colmap_binary<span class="token punctuation">}</span></span><span class="token string"> mapper --database_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>db<span class="token punctuation">}</span></span><span class="token string"> --image_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>images<span class="token punctuation">}</span></span><span class="token string"> --output_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
do_system<span class="token punctuation">(</span>
    <span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>colmap_binary<span class="token punctuation">}</span></span><span class="token string"> bundle_adjuster --input_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">/0 --output_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">/0 --BundleAdjustment.refine_principal_point 1"</span></span><span class="token punctuation">)</span>
<span class="token keyword">try</span><span class="token punctuation">:</span>
    shutil<span class="token punctuation">.</span>rmtree<span class="token punctuation">(</span>text<span class="token punctuation">)</span>
<span class="token keyword">except</span><span class="token punctuation">:</span>
    <span class="token keyword">pass</span>
do_system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"mkdir </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>text<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
do_system<span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"</span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>colmap_binary<span class="token punctuation">}</span></span><span class="token string"> model_converter --input_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>sparse<span class="token punctuation">}</span></span><span class="token string">/0 --output_path </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>text<span class="token punctuation">}</span></span><span class="token string"> --output_type TXT"</span></span><span class="token punctuation">)</span>

def variance_of_laplacian(image):
return cv2.Laplacian(image, cv2.CV_64F).var()

def sharpness(imagePath):
image = cv2.imread(imagePath)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
fm = variance_of_laplacian(gray)
return fm

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 rotmat(a, b):
a, b = a / np.linalg.norm(a), b / np.linalg.norm(b)
v = np.cross(a, b)
c = np.dot(a, b)
# handle exception for the opposite direction input
if c < -1 + 1e-10:
return rotmat(a + np.random.uniform(-1e-2, 1e-2, 3), b)
s = np.linalg.norm(v)
kmat = np.array([[0, -v[2], v[1]], [v[2], 0, -v[0]], [-v[1], v[0], 0]])
return np.eye(3) + kmat + kmat.dot(kmat) * ((1 - c) / (s ** 2 + 1e-10))

def closest_point_2_lines(oa, da, ob,
db): # returns point closest to both rays of form o+td, and a weight factor that goes to 0 if the lines are parallel
da = da / np.linalg.norm(da)
db = db / np.linalg.norm(db)
c = np.cross(da, db)
denom = np.linalg.norm(c) ** 2
t = ob - oa
ta = np.linalg.det([t, db, c]) / (denom + 1e-10)
tb = np.linalg.det([t, da, c]) / (denom + 1e-10)
if ta > 0:
ta = 0
if tb > 0:
tb = 0
return (oa + ta da + ob + tb db) 0.5, denom

if name == main:
args = parse_args()
if args.video_in != “”:
run_ffmpeg(args)
if args.run_colmap:
run_colmap(args)
AABB_SCALE = int(args.aabb_scale)
SKIP_EARLY = int(args.skip_early)
IMAGE_FOLDER = args.images
TEXT_FOLDER = args.text
OUT_PATH = args.out

<span class="token comment"># Check that we can save the output before we do a lot of work</span>
<span class="token keyword">try</span><span class="token punctuation">:</span>
    <span class="token builtin">open</span><span class="token punctuation">(</span>OUT_PATH<span class="token punctuation">,</span> <span class="token string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>close<span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token keyword">except</span> Exception <span class="token keyword">as</span> e<span class="token punctuation">:</span>
    <span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"Could not save transforms JSON to </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>OUT_PATH<span class="token punctuation">}</span></span><span class="token string">: </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>e<span class="token punctuation">}</span></span><span class="token string">"</span></span><span class="token punctuation">)</span>
    sys<span class="token punctuation">.</span>exit<span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span>

<span class="token keyword">print</span><span class="token punctuation">(</span><span class="token string-interpolation"><span class="token string">f"outputting to </span><span class="token interpolation"><span class="token punctuation">{<!-- --></span>OUT_PATH<span class="token punctuation">}</span></span><span class="token string">..."</span></span><span class="token punctuation">)</span>
cameras <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span><span class="token punctuation">}</span>
<span class="token keyword">with</span> <span class="token builtin">open</span><span class="token punctuation">(</span>os<span class="token punctuation">.</span>path<span class="token punctuation">.</span>join<span class="token punctuation">(</span>TEXT_FOLDER<span class="token punctuation">,</span> <span class="token string">"cameras.txt"</span><span class="token punctuation">)</span><span class="token punctuation">,</span> <span class="token string">"r"</span><span class="token punctuation">)</span> <span class="token keyword">as</span> f<span class="token punctuation">:</span>
    camera_angle_x <span class="token operator">=</span> math<span class="token punctuation">.</span>pi <span class="token operator">/</span> <span class="token number">2</span>
    <span class="token keyword">for</span> line <span class="token keyword">in</span> f<span class="token punctuation">:</span>
        <span class="token comment"># 1 SIMPLE_RADIAL 2048 1536 1580.46 1024 768 0.0045691</span>
        <span class="token comment"># 1 OPENCV 3840 2160 3178.27 3182.09 1920 1080 0.159668 -0.231286 -0.00123982 0.00272224</span>
        <span class="token comment"># 1 RADIAL 1920 1080 1665.1 960 540 0.0672856 -0.0761443</span>
        <span class="token keyword">if</span> line<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"#"</span><span class="token punctuation">:</span>
            <span class="token keyword">continue</span>
        els <span class="token operator">=</span> line<span class="token punctuation">.</span>split<span class="token punctuation">(</span><span class="token string">" "</span><span class="token punctuation">)</span>
        camera <span class="token operator">=</span> <span class="token punctuation">{<!-- --></span><span class="token punctuation">}</span>
        camera_id <span class="token operator">=</span> <span class="token builtin">int</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        camera<span class="token punctuation">[</span><span class="token string">"w"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        camera<span class="token punctuation">[</span><span class="token string">"h"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        camera<span class="token punctuation">[</span><span class="token string">"fl_x"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        camera<span class="token punctuation">[</span><span class="token string">"fl_y"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">4</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
        camera<span class="token punctuation">[</span><span class="token string">"k2"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
        camera<span class="token punctuation">[</span><span class="token string">"k3"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
        camera<span class="token punctuation">[</span><span class="token string">"k4"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
        camera<span class="token punctuation">[</span><span class="token string">"p1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
        camera<span class="token punctuation">[</span><span class="token string">"p2"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token number">0</span>
        camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> camera<span class="token punctuation">[</span><span class="token string">"w"</span><span class="token punctuation">]</span> <span class="token operator">/</span> <span class="token number">2</span>
        camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> camera<span class="token punctuation">[</span><span class="token string">"h"</span><span class="token punctuation">]</span> <span class="token operator">/</span> <span class="token number">2</span>
        camera<span class="token punctuation">[</span><span class="token string">"is_fisheye"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">False</span>
        <span class="token keyword">if</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"SIMPLE_PINHOLE"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"PINHOLE"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"fl_y"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"SIMPLE_RADIAL"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"RADIAL"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k2"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"OPENCV"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"fl_y"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k2"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">9</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"p1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">10</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"p2"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">11</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"SIMPLE_RADIAL_FISHEYE"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"is_fisheye"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">True</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"RADIAL_FISHEYE"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"is_fisheye"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">True</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k2"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">8</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
        <span class="token keyword">elif</span> els<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span> <span class="token operator">==</span> <span class="token string">"OPENCV_FISHEYE"</span><span class="token punctuation">:</span>
            camera<span class="token punctuation">[</span><span class="token string">"is_fisheye"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token boolean">True</span>
            camera<span class="token punctuation">[</span><span class="token string">"fl_y"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">5</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cx"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">6</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"cy"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token builtin">float</span><span class="token punctuation">(</span>els<span class="token punctuation">[</span><span class="token number">7</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
            camera<span class="token punctuation">[</span><span class="token string">"k1"</span><span class="token punctuation">]</span> <span class="token operator">=</span> <span

原文链接:https://blog.csdn.net/weixin_50973728/article/details/127962493

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐