用于colmap重建结果、pcd/ply、6D位姿的点云可视化工具

工具介绍:提供一款用于点云可视化windows的工具

可视化的对象包括:
1、colmap重建结果
2、pcd\ply格式的点云
3、位姿R|t可视化
4、在线接收点python发送的坐标
在这里插入图片描述

其他功能:点云保存、颜色修改、点云隐藏、点云大小调整
工具地址:用于colmap重建结果、pcd/ply、6D位姿的点云可视化工具

1、colmap重建结果可视化

Colmap是一款基于SFM进行点云重建的开源工具,但是使用colmap对重建的点云进行可视化时,需要提供一下四个文件数据(images,camera,points3D,project),其中images文件是用于存储图像的位姿和特征点、cameras文件保存相机的参数信息,points3D文件保存重建坐标点,project文件是保存colmap的配置信息。只有在一下四个文件齐全的情况下才可以使用colmap来加载重建结果
在这里插入图片描述
但是,通常情况下我们从共数据库中获取的数据只给我们提供了前三个文件,此时就无法使用colmap加载重建结果例如用于图像定位的:CMU 数据集,现有的colmap就无法对重建结果进行可视化。
在这里插入图片描述
因此,为例解决colmap无法加载重建点云的问题,该工具提供了一个对该类数据进行可视化的工具,使用过程:点击colmap->选择sparse文件所在路径,点击确定
在这里插入图片描述

2、pcd/ply点云可视化工具

pcd和ply是点云保存的通用格式,作为一款用于点云可视化的工具对该类数据的可视化必不可少。使用过程:点击读取点云》选择pcd/ply格式的点云》确定
在这里插入图片描述

R|t位姿可视化

熟悉坐标位置的读者或许知道R|t具体指什么,其中R是旋转矩阵,t是平移量,通过这两个参数就可以得到一个坐标点。
在该工具中,提供的接口读取的是一个txt文件,其中该文件保存的数据结构为(name,四元数,t)此处为什么要用四元组呢?因为四元数保存的数据只有四个,而旋转矩阵有9个,关于两者之间的变换过程如下。
在这里插入图片描述

# 四元数转R旋转矩阵
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]])
# R|t转xyz坐标
pos_xyz = R.T @ t

# 旋转矩阵转四元数
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

数据读取结果:
在这里插入图片描述

python坐标点在线读取

该功能可以实时获取python端发送的坐标点,并动态的绘制坐标点。
python端数据发送的代码如下:

import socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
hostname = socket.gethostname()
ip = socket.gethostbyname(hostname)
client.connect((str(ip), 10101))
msg=client.recv(1024)
print("pose,x,y,z,r,g,b")
data=""
while(data!='exit'):
    data=input()
    client.send(data.encode('utf-8'))
client.close()

在这里插入图片描述
点云保存:选中需要保存的对象——》点击点云保存,输入**.pcd的文件名称将点云保存到本地。
python坐标点保存:点击 保存 按钮保存python端传输的坐标点:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43627520/article/details/130632179