PCL-使用potree可视化

2023-05-16

前言

在几篇文章中,基本实现了对PCL相关操作,最近在github上找到了Web端对点云数据可视化兼容很好的项目 Potree 对此本文将介绍如何使用Potree来进行web端的可视化。

1. Potree 官方运行

Potree 是基于ThreeJS之上的,对ThreeJS进行进步封装方便与点云数据的操作。
其官方的例子如下:

在github上面下载官方源码:

git clone https://github.com/potree/potree.git

然后运行安装以及运行命令如下:

cd potree
npm build
npm start

打开网页 127.0.01:1234,展示出如下界面即运行示例成功:
请添加图片描述

2. 自定义点云图

2.1 点云转化

查看官网说明,要使得Potree可以正确解析以及展示数据,必须经过PotreeConvert工具将点云数据进行转化成二进制数据。

同理在github下载相关代码,进行编译运行,执行如下命令 如下:
git clone https://github.com/potree/PotreeConverter.git
cd PotreeConverter
mkdir build
cd build
cmake ..
make 

这时会编译成功PotreeConverter可执行文件,在同级目录下面,将点云数据las文件复制到此处,在同级目录下执行:

./PotreeConverter xxx.las -o output

相关的转化过程会输出到output目录下,如下图,
请添加图片描述
至此完成了potree所需展示的翻译文件。

2.2 可视化

打开potree项目的example目录,随便复制其中的一个html文件,并且将上述生成的output目录复制到potree点云目录里面,其中html内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<meta name="description" content="">
	<meta name="author" content="">
	<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
	<title>Potree Viewer</title>

	<link rel="stylesheet" type="text/css" href="../build/potree/potree.css">
	<link rel="stylesheet" type="text/css" href="../libs/jquery-ui/jquery-ui.min.css">
	<link rel="stylesheet" type="text/css" href="../libs/openlayers3/ol.css">
	<link rel="stylesheet" type="text/css" href="../libs/spectrum/spectrum.css">
	<link rel="stylesheet" type="text/css" href="../libs/jstree/themes/mixed/style.css">
</head>

<body>
	<script src="../libs/jquery/jquery-3.1.1.min.js"></script>
	<script src="../libs/spectrum/spectrum.js"></script>
	<script src="../libs/jquery-ui/jquery-ui.min.js"></script>
	
	
	<script src="../libs/other/BinaryHeap.js"></script>
	<script src="../libs/tween/tween.min.js"></script>
	<script src="../libs/d3/d3.js"></script>
	<script src="../libs/proj4/proj4.js"></script>
	<script src="../libs/openlayers3/ol.js"></script>
	<script src="../libs/i18next/i18next.js"></script>
	<script src="../libs/jstree/jstree.js"></script>
	<script src="../build/potree/potree.js"></script>
	<script src="../libs/plasio/js/laslaz.js"></script>
	
	<!-- INCLUDE ADDITIONAL DEPENDENCIES HERE -->
	<!-- INCLUDE SETTINGS HERE -->
	
	<div class="potree_container" style="position: absolute; width: 100%; height: 100%; left: 0px; top: 0px; ">
		<div id="potree_render_area" style="background-image: url('../build/potree/resources/images/background.jpg');"></div>
		<div id="potree_sidebar_container"> </div>
	</div>
	
	<script type="module">

		window.viewer = new Potree.Viewer(document.getElementById("potree_render_area"));
		
		viewer.setEDLEnabled(true);
		viewer.setFOV(60);
		viewer.setPointBudget(1_000_000);
		viewer.loadSettingsFromURL();
		viewer.setBackground("skybox");
		
		// viewer.setDescription(`Point cloud courtesy of PG&E and <a href="https://opentopography.org/">Open Topography</a>.`);
		
		viewer.loadGUI(() => {
			viewer.setLanguage('en');
			$("#menu_tools").next().show();
			$("#menu_clipping").next().show();
			viewer.toggleSidebar();
		});
		
		// Load and add point cloud to scene
		Potree.loadPointCloud("../pointclouds/output/metadata.json", "Demo", e => {
			console.log(e);
			let scene = viewer.scene;
			let pointcloud = e.pointcloud;
			
			let material = pointcloud.material;
			material.size = 0.6;
			material.pointSizeType = Potree.PointSizeType.ADAPTIVE;
			material.shape = Potree.PointShape.SQUARE;
			material.activeAttributeName = "rgba";
			
			scene.addPointCloud(pointcloud);
			
			viewer.fitToScreen(0.6);
		});

	</script>
	
	
  </body>
</html>

在127.0.0.1:1234中打开网页,既可发生点云的替换,如下图:
在这里插入图片描述

3.集成Vue

通过上述的集成已经基本实现了网页端集成了Potree,当下通过Vue来进行项目开发,因此需将Potree集成到Vue之中

3.1 集成Potree-core

在npm中找到了Potree-core对Potree集成的支持,因此在Vue项目中引入该依赖,

yarn add potree-core 

在vue中新建页面,引入相关的Potree-core如下:

import * as THREE from 'three'
// import {onMounted} from "vue";
// import {PCDLoader} from "three/examples/jsm/loaders/PCDLoader";
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'
import { PointCloudOctree, Potree } from 'potree-core'
import { BoxGeometry, Mesh, MeshBasicMaterial, Vector3, AmbientLight, Raycaster, Vector2, SphereGeometry } from 'three'

const baseUrl = 'http://127.0.0.1:10200/upload/output/'

// const ws = new WebSocket("ws://127.0.0.1:10200/api/three-scan/websocket/pcd");

const potree = new Potree()
// const loader = new THREE.Loader();
const scene = new THREE.Scene()
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000)

const canvas = document.createElement('canvas')
canvas.style.position = 'absolute'
canvas.style.top = '0px'
canvas.style.left = '0px'
canvas.style.width = '100%'
canvas.style.height = '100%'

const pointClouds: PointCloudOctree[] = []

document.body.appendChild(canvas)

const renderer = new THREE.WebGLRenderer({
  canvas: canvas,
  alpha: true,
  logarithmicDepthBuffer: false,
  precision: 'highp',
  premultipliedAlpha: true,
  antialias: true,
  preserveDrawingBuffer: false,
  powerPreference: 'high-performance'
})
// const geometry = new THREE.BoxGeometry(25, 1, 25)
// const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 })
// const cube = new THREE.Mesh(geometry, material)
// cube.position.y = -2

// scene.add(cube)
scene.add(new AmbientLight(0xffffff))

const controls = new OrbitControls(camera, canvas)
camera.position.z = 10

const raycaster = new Raycaster()
raycaster.params.Points.threshold = 1e-2
const normalized = new Vector2()

canvas.onmousemove = function (event) {
  normalized.set(event.clientX / canvas.width * 2 - 1, -(event.clientY / canvas.height) * 2 + 1)
  raycaster.setFromCamera(normalized, camera)
}

canvas.ondblclick = function () {
  const intesects = raycaster.intersectObject(scene, true)
  if (intesects.length > 0) {
    const geometry = new SphereGeometry(0.2, 32, 32)
    const material = new MeshBasicMaterial({ color: Math.random() * 0xAA4444 })
    const sphere = new Mesh(geometry, material)
    sphere.position.copy(intesects[0].point)
    scene.add(sphere)
  }
}

const points = new Potree()
points.pointBudget = 10000000

points.loadPointCloud('metadata.json', (url: string) => {
  return `${baseUrl}${url}`
}).then((pco:PointCloudOctree) => {
  pco.material.size = 1.0
  pco.material.shape = 2
  pco.material.inputColorEncoding = 1
  pco.material.outputColorEncoding = 1

  console.log('PointCloud file loaded', pco)

  const box = pco.pcoGeometry.boundingBox
  const size = box.getSize(new Vector3())

  const geometry = new BoxGeometry(size.x, size.y, size.z)
  const material = new MeshBasicMaterial({ color: 0xFF0000, wireframe: true })
  const mesh = new Mesh(geometry, material)
  // mesh.position.copy(pco.position);
  // mesh.scale.copy(pco.scale);
  // mesh.rotation.copy(pco.rotation);
  mesh.raycast = () => false

  size.multiplyScalar(0.5)
  // mesh.position.add(new Vector3(size.x, size.y, -size.z))
  //
  // scene.add(mesh)

  add(pco)
})

function loop () {
  // cube.rotation.y += 0.01

  potree.updatePointClouds(pointClouds, camera, renderer)
  controls.update()
  renderer.render(scene, camera)
  requestAnimationFrame(loop)
}

loop()

function add (pco: PointCloudOctree): void {
  scene.add(pco)
  pointClouds.push(pco)
}

document.body.onresize = () => {
  const width = window.innerWidth
  const height = window.innerHeight
  renderer.setSize(width, height)
  camera.aspect = width / height
  camera.updateProjectionMatrix()
}
document.body.onresize()

在添加相关路由,启动vue项目如下所示:
在这里插入图片描述

3.2 iframe引入

如果采用上述方式引入potree,仅仅只能引入核心包,相关的控制工具没有被引入,对比官网相关的示例,缺少相关测量工具,以及其他的交互性功能。因此考虑采用iframe的方式集成到Vue项目中去,在potree项目中,执行如下 命令进行打包

npm build

将生成好的build,lib目录进行拷贝到Vue目录下面的public目录下,并且将所展示的html文件也复制到public目录下,如下目录结构:
在这里插入图片描述
新建Vue文件,引入iframe组件如下:

<template>
  <iframe src="http://127.0.0.1:8080/demo.html" width="100%" height="100%" ref="iframeHtml"></iframe>
</template>

启动Vue项目,打开本页面如下
在这里插入图片描述
故此Potree项目已经集成到Vue项目中,

总结

本文通过Potree的方式进行PCL点云数据渲染,相比于原始的Three.js来说大大的提高其渲染的速度。并且在对图形进行选择放大的时候,感觉不出卡顿的现象,方便于web端的操作与查看。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PCL-使用potree可视化 的相关文章

  • 技术分享 | Prometheus(P450)-室内外避障

    原理说明 Astar进行全局路径规划 全局路径规划 1 全局算法和局部算法 全局路径规划是在已知的环境中 xff0c 给机器人规划一条路径 xff0c 路径规划的精度取决于环境获取的准确度 xff0c 全局路径规划可以找到最优解 xff0c
  • PX4官方动态 | 基于FPGA和px4的精准自主降落

    近期Ramon Roche在Twitter上发布了关于使用FPGA实现无人机在目标物体上能够进行精准自主着陆的推文 这次的功能实现是一个在读博士的学生所做的项目 xff0c 希望能在开源社区中得到推广并吸引其余有意向的开发者能一起进行研究
  • 技术分享 | 带你具体部署VINS_FUSION_GPU版本

    前期准备工作已经完成 xff0c 接下来我们就准备VINS在NX的落地 1 下载源码编译 首先VINS gpu版本需要引入OpenCV CUDA版本的加速 xff0c 由于我们的NX镜像已经安装好CUDA xff0c 这里就不在赘叙 xff
  • PX4官方动态 | 带你走进官方教学(二)

    本期是我们第二期官方教学 xff0c 不知道大家有没有跟着我们一起学习第一期的教学呢 xff0c 如果没有看过的同学可以点击链接进行第一期的学习后再来看我们第二期内容 在第一期我们告诉了大家学习方法 xff0c 以及如果从零开始使用PX4自
  • 吊舱追踪 | 车机协同作战小实验

    大家好 xff0c 我是阿木实验室的梓衡 xff0c 今天为大家带来的是我们最新研发的智能吊舱的测试 首先 xff0c 我们会把小吊舱挂载在P450无人机上 xff0c 我们所选择的地面追踪目标是我们的R300无人车 这个吊舱搭载了200W
  • 工实小报 | P450室外首飞教学

    本文将给大家介绍我们P450无人机在进行室外首次飞行时 xff0c 一些常见的注意事项及正确的使用方法 我们在使用这种PX4开源无人机时 xff0c 一定要有一个清楚的认识 它和大疆那种消费级无人机在使用和操作上 xff0c 是有非常大的不
  • 5G时代,将为无人机通讯传输带来哪些新变化?

    众所周知 xff0c 我们正在大步迈向5G时代 xff0c 在近几年的各类媒体关于5G的报道也络绎不绝 与此同时 xff0c 无人机作为空中人工智能领域的 智慧眼 xff0c 其行业应用迅速发展 xff0c 应用需求不断增加 xff0c 对
  • 超小型吊舱它来了,轻松适配多种移动机器人使用场景

    一 设计理念 在无人机 无人车 机器狗等移动机器人场景中 xff0c 往往需要一款小巧 重量轻 成本可控的三轴云台吊舱来实现无人机的航拍 机器人搜寻以及图像识别等功能 而市面上的云台吊舱体积都比较大 xff0c 一些小型增稳云台也不支持角度
  • P600旗舰视觉款正式发布,重新定义视觉追踪与精准定位!

    P600旗舰视觉款无人机是一款准行业级无人机 xff0c 搭载RTK定位系统 xff0c 定位精度可达厘米级 xff0c 飞行路径更精准 姿态更稳定 xff1b 机身搭载Allspark机载计算机 xff0c 算力可达21TOPS xff0
  • [STM32学习笔记1]GPIO初始化,点亮LED

    一 使用STM32cubeMX新建工程并初始化 1 打开STM32cubeMX并新建工程 xff0c 芯片输入STM32F103C8T6 双击芯片进入配置界面 xff0c 首先选择调试方式SYS gt debug gt serial wir
  • 开发人员调试IE9默认IE7模式打开

    IE9的默认就是IE9标准模式啊 xff0c 你可能是启用了组策略里的 打开Internet Explorer 7标准模式 功能 禁用就行 开始菜单 运行 输入gpedit msc后确定 用户设置 管理模板 Windows组件 Intern
  • visual studio屏蔽掉一段代码的组合键

    注释 xff1a Ctrl 43 k 43 c 取消注释 xff1a Ctrl 43 k 43 u
  • 如何在VS Code中运行C或C++程序

    前言 众所周知 xff0c VS Code源代码编辑器 xff0c 是目前最为流行的代码开发工具之一 xff0c 特别受到Web前端开发者的青睐 xff0c 当然还有大名鼎鼎的HBuilder X也是非常给力的 xff0c 我们可以根据自己
  • C语言指针作为形参的一些问题

    C语言中指针是个非常麻烦的事件 xff0c 本人大学学了几年指针 xff0c 用起来还是丈二和尚 xff0c 摸不着头脑 xff0c 特别是在函数中作为参数传递 xff0c 申请空间什么的 xff0c 一头雾水 xff0c 看到这篇文件写的
  • visual studio的cpp文件添加c文件的extern变量出错原因解析

    比如extern这个变量报这个错 xff1a 说这个来自c文件的extern变量为无法解析的外部符号 可以考虑将cpp文件后缀名改成c文件 xff0c 或者加个extern 34 C 34 就可以解决了 xff01 xff01
  • 一文带你全面解析postman工具的使用(效率篇)

    说明 xff1a 由于前面的一文篇幅太大 xff0c 导致无法放在一文发布 xff0c 故这篇文章只是postman工具介绍的第二部分 xff0c 接下来介绍的内容是基于上文的基础往下进行的 三 postman快捷功能 在这一个部分中 xf
  • stm32cube生成串口代码纪要

    这里只讲思路 xff0c 不讲具体代码 第一步 xff1a static void MX USART1 UART Init void xff1b 函数为stm32cube 自动生成 xff0c 只是用于配置串口传输格式 xff0c 波特率等
  • (完整版)Python读取CANalyst-II分析仪(创芯科技)接口函数

    根据需求 xff0c 需要读取CAN总线的信息 目前市面上主流的做法是 xff0c 通过ZLG周立功的CAN设备来进行读取 由此 xff0c 派生出很多小品牌 xff0c 其设备的基本用法和ZLG非常相似 xff0c 本文以创芯科技的CAN
  • rostopic pub的一些问题汇总解决

    1使用rostopic pub给 cmd vel topic指定了速度 xff0c 但是gazebo中的模拟机器人并未发生运动 介绍 xff1a 打开模拟器 模拟器打开 记录位置 执行命令 xff0c 就是手动控制小车运动的 查看节点 xf
  • ROS中显示inf问题(激光雷达laserscan rviz)

    需要改动两处代码 xff1a robot sim demo urdf sick tim urdf xacro 文件 xff1a 将带有 xff02 gpu xff02 的那一行注释掉 xff0c 使用非 xff02 gpu xff02 那一

随机推荐

  • 阿里云 开通 https CDN 客户端和服务器不支持常用的 SSL 协议版本或加密套件

    需要在CDN管理配置上添加https证书 HTTPS设置
  • 1e-7

    1e 7 就是10的负7次方
  • 3维空间中点、线、面之间的数学关系(python代码)

    1 面的定义 三维空间中的平面由两个量确定 xff1a 一个法向量 xff08 垂直于该平面的向量 xff09 一个已知点 xff08 位于该平面上的一个点 2 叉乘和点乘的区别 2 1叉乘的计算方式 xff0c 叉乘用来得到垂直于两条向量
  • 三维空间中,向量在另外一个向量或者面上的投影

    1 向量在另外一个向量上的投影 求向量u在向量v上的投影 定义为u xff0c 为两向量的夹角 一个向量有两个属性 xff0c 大小和方向首先明确向量点乘的含义 u v
  • C++编程02(引用、参数传递、内联函数)

    C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 引用 文章目录 C 43 43 编程02 xff08 引用 参数传递方式 内联函数 xff09 一 引用1 引用的实质2 引用必须初始化3 对数组建立引用 二
  • 使用Git bash查看之前版本和恢复最新版本的方法

    项目场景 xff1a 作为实习生 xff0c 一直在帮公司搞C 43 43 的图像识别项目 xff0c 因为总是改需求 xff0c 所以我的代码注释的一大片 xff0c 不便于整理 xff0c 有时候改的改的 xff0c 就找不到之前的版本
  • Windows平台下CMake使用报错No CMAKE_CXX_COMPILER could be found

    今天在笔记本建立了一个Cmakelists xff0c 使用cmake编译的时候 xff0c 报错 No CMAKE CXX COMPILER could be found No CMAKE C COMPILER could be foun
  • Cartographer编译方法及编译出错(glog库链接错误)解决方法

    最近在重新调试Carto代码 xff0c 想把自己的代码加入到Carto中 xff0c 原本想在IDE中调试 xff0c 然而Carto编译方式比较奇葩 xff08 catkin make isolated install use ninj
  • 什么是RTOS?RTOS与普通操作系统的区别

    一 xff1a 什么是RTOS RTOS Real Time Operating System xff0c 实时操作系统 实时性是其最大特征 xff0c 实时操作系统中都要包含一个实时任务调度器 xff0c 这个任务调度器与其它操作系统的最
  • 进度条(CSS)

    效果 xff08 实际有动态效果 xff09 html span class token tag span class token tag span class token punctuation lt span div span span
  • 终端命令行打开vscode

    在指定文件夹内 xff0c 使用终端命令行打开vscode 在当前目录打开vscode code 如果code命令无法使用 xff0c 需要配路径 xff0c 如下 xff1a 打开bash或者zsh配置文件 bash 用户请使用 vi b
  • 串口缓冲区管理分析

    一 概述 xff1a 串口使用时一般包含两个缓冲区 xff0c 即发送缓冲区和接收缓冲区 发送数据时 xff0c 先将数据存在发送缓冲区 xff0c 然后通过串口发送 xff1b 接收数据时 xff0c 先将接收的数据存在接收缓冲区 xff
  • array element has incomplete type

    http stackoverflow com search q 61 luaL reg 43 incomplete 43 type libs edje lua2 o edje lua2 c 183 error array type has
  • rt-thread学习记录(一)--内核的移植

    rt thread学习记录 xff08 一 xff09 内核的移植 1 基本选择 在rt thread官网上 xff0c 看到其对stm32芯片的支持 xff0c 因此选择stm32c8t6最小系统来进行移植内核 xff0c rt thre
  • rt-thread内核启动分析

    1 项目准备 上一节的基本环境 如rh thread 基本环境的搭建 硬件材料stm32f103C8T6 以及st link rt thread 内核启动官网分析 在分析rt thread代码的时候 由于rt thread的代码是十分优秀的
  • 达梦数据库sql语句记录

    登入 在ubuntu上安装好达梦数据 xff0c 并且生成实例 xff0c 在ubuntu上进行安装目录 xff0c 采用在tools目录下 xff0c 使用 disql进行命令行模式 xff0c 连接服务器 xff1a Conn sysd
  • vertx web开发(一)

    vertx web开发 最近在开发中 xff0c 由于spring 的大而全 xff0c 反而不实用于一下小项目 xff0c 因为spring boot在空载的情况 xff0c 至少其内存占用超过150M 而对于一些简单的项目反到不适用 而
  • kotlin协程实现原理

    传统runnable接口实现 在java中 xff0c 很多耗时的行为通过实现runnable接口 xff0c 并且通过线程运行下这些耗时的任务 xff0c 例如 xff1a span class token keyword public
  • PCL---RANSAC随机采样一致性算法

    前言 通过前面的文章 xff0c 我们基本上代建的相关环境 本文将继续基于此继续学习PCL相关采样一致性算法 基础代码下载 1 准备 1 1 Ransac算法介绍 RANSAC从样本中随机抽选出一个样本子集 xff0c 使用最小方差估计算法
  • PCL-使用potree可视化

    前言 在几篇文章中 xff0c 基本实现了对PCL相关操作 xff0c 最近在github上找到了Web端对点云数据可视化兼容很好的项目 Potree 对此本文将介绍如何使用Potree来进行web端的可视化 1 Potree 官方运行 P