【nerf数据准备 colmap(windows,ubuntu)】
windowscolmap下载解压后运行数据准备 准备工作文件夹,images存放文件,sparse存放colmap结果文件导出模型在sparse下的0文件夹官网地址AI写代码dart运行12官方包网址:https://debian.pkgs.org/11/debian-main-amd64/colmap_3.6+really3.6-1_amd64.deb.htmlAI写代码python运行123
windows
colmap
下载解压后运行

数据准备
准备工作文件夹,images存放文件,sparse存放colmap结果文件





导出模型在sparse下的0文件夹

ubuntu
官方安装方法:
apt-get update apt-get install colmapAI写代码 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-devAI写代码 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-devAI写代码 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 installAI写代码 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.gitAI写代码 python 运行
- 1
colmap克隆
git clone https://github.com/colmap/colmap cd colmap git checkout dev mkdir build cd build cmake .. make -j sudo make installAI写代码 python 运行
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
验证
colmap -h colmap guiAI写代码 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 1AI写代码 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 1AI写代码 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 trueAI写代码 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"> >nul 2>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"> >nul 2>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
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)