谷歌draco

Draco 由谷歌 Chrome 媒体团队设计,旨在大幅加速 3D 数据的编码、传输和解码。因为研发团队的 Chrome 背景,这个开源算法的首要应用对象是浏览器。但既然谷歌把它开源,现在全世界的开发者可以去探索 Draco 在其他场景的应用,比如说非网页端。目前,谷歌提供了它的两个版本: JavaScript 和 C++。

Draco 可以被用来压缩 mesh 和点云数据。它还支持压缩点( compressing points),连接信息,纹理协调,颜色信息,法线( normals)以及其他与几何相关的通用属性。下面是谷歌官方发布的 Draco Mesh 文件压缩率,可以看出,它大幅优于 ZIP。

Draco 的算法既支持有损模式,也支持无损。这给普通消费者带来的好处还不太明显——毕竟大多数人对分辨率并没有强迫症,有损压缩带来的轻微画质改变完全在承受范 围之内。但对专业应用和科研应用的意义就很大了。这就好比 JPEG 之于 PNG。后者用于游戏和 VR 应用完全没有问题,降低的画质很难用肉眼察觉。但在科研点云数据中,任何信息都不能丢失。

如何使用draco?

github上简介:

Draco is a library for compressing and decompressing 3D geometric meshes and point clouds. It is intended to improve the storage and transmission of 3D graphics.

(1)下载源码

git clone https://github.com/google/draco.git

(2) cd dracs

mkdir build

cmake ..

如果提示你cmake的版本太低了,则需要升级cmake ,命令如下

sudo add-apt-repository ppa:george-edison55/cmake-3.x

sudo apt-get update

如果你从来没装过cmake 则sudo apt-get install cmake(经过测试 即使装过还是用这个命令直接升级比较好) 如果你装过cmake 则sudo apt-get upgrade

安装完后,用命令:cmake --version 查看当前的cmake版本,可以看到现在cmake的版本为3.2.2

之后就可以编译通过,make 一下傻等片刻就安装成功

那么就可以使用查看一下效果,为了可视化以下,所以还是使用强大的PCL库来对比以下,在PCL库中读取PLY文件也是有对应的函数的

class pcl::PCDReader()与class pcl::FLYReader() 分别是PCD,和FLY文件格式的接口的实现

class pcl::PCDWriter()与class pcl::FLYWriter()分别是对PCD,FLY文件写入接口的实现

查看发现它们的其他函数基本都是一样的,就是把PCD 换成FLY即可

所以我们就可以使用draco来编码FLY格式的点云数据,然后在解码生成FLY文件,再在点云库中可视化一下,并且查看编码前后编码后文件的大小,可以看看编码的效率

首先我们查看原始的文件以及它的大小3M

原始文件大小

对原文件编码 生成了out.drc文件并查看文件大小113.KB的大小

编码命令

编码后的文件大小

并可视化原始点云,如下图:

然后为了在可视化编码后再解码的效果,所以再查看解压后的大小为431.5KB

解码命令

解码后的文件的大小

可视化的效果和之前的是一样的,同时为了查看有没有丢失点数,打印出来看一下,发现点云数目没有变化都是35947 data points

总结以下,原来的文本是3M,编码后是113.KB文件,文件很小,压缩的效率非常高,为了再可视化,所以再解压,可视化的效果与原点云效果是一样的,

原始文件可视化并输出点云的大小

解码后的点云可视化并打印点云数目

结合PCL库可视化的代码如下:

#include <iostream>              //标准C++库中的输入输出的头文件
#include <pcl/io/pcd_io.h>       //PCD读写类相关的头文件
#include <pcl/point_types.h>     //PCL中支持的点类型的头文件
#include <pcl/io/ply_io.h>#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
int main (int argc, char** argv)
{
  //创建一个PointCloud<pcl::PointXYZ>    boost共享指针并进行实例化
 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);  
 //打开点云文件
 if (pcl::io::loadPLYFile<pcl::PointXYZ> ("bun_zipper.ply", *cloud) == -1)
 {
   PCL_ERROR ("Couldn't read file bun_zipper.ply \n");    return (-1);
 }std::cout << "Loaded "
           << cloud->width * cloud->height            << " data points from bun_zipper.ply with the following fields: "
           << std::endl;boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("cloud"));
viewer->addPointCloud<pcl::PointXYZ>(cloud,"cloud");while(!viewer->wasStopped())
 {
viewer->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000000));
}  return (0);
}

对于draco的算法以及代码都没有详细的研究,这里只是看看它的压缩效率,同时我们在编码的时候,那几条命令时可以设置参数的,也可以设置编码的等级,所以还需要更加深入的研究,如有问题可以与我交流,谢谢

本文分享自微信公众号 - 点云PCL(dianyunPCL)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-07-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • shell教程

    上面这段代码中,echo是打印的意思,而>是重定向的意思,chmod是修改权限的意思。shell脚本以.sh为结尾。

    用户2337871
  • Linux程序管理与SELinux

    一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为进程(process)。进程是操作系统上非常重要的概念,所有系统上面跑的数据都会以进程的类型存在。

    用户5807183
  • 强大、有趣、好玩、又装B的19 个 Linux 命令!

    输出一句话,有笑话,名言什么的 (还有唐诗宋词sudo apt-get install fortune-zh)

    格姗知识圈
  • 机器视觉与Tesseract介绍

    1.可以通过 apt-get 安装:命令:sudo apt-get install tesseract-ocr

    用户2337871
  • 离线安装mongodb

    sudo mv mongodb-linux-x86_64-ubuntu1604-3.4.0 /usr/local/mongodb

    用户2337871
  • Linux系统:centos7下搭建Rocketmq4.3中间件,和监控台

    rocketmq的默认配置极其耗内存,要进行修改。 1)修改runserver.sh配置 注释掉原来的,添加新配置

    知了一笑
  • 通过nginx+uwsgi部署django应用在ubuntu

    1.安装python3-pip -------------sudo apt-get install python3-pip 2.安装虚拟环境和虚拟环境管理包...

    用户2337871
  • 怎样在Linux内核中埋炸弹获取root权限<2/2>终结篇

    上文中的漏洞内核模块代码和应用层代码两者狼狈为奸,修改了系统内存中所有的jeffnice+20为jeffnice-19。

    jeff xie
  • Java:Headless Mode

    从报错中可以看出,服务器在调用AWT绘图API时,尝试通过地址“localhost:10.0”与一个叫“X11 Window Server”的东西建立连接,但失...

    WEBJ2EE
  • 后端开发实践:Spring Boot项目模板

    在我的工作中,我从零开始搭建了不少软件项目,其中包含了基础代码框架和持续集成基础设施等,这些内容在敏捷开发中通常被称为“第0个迭代”要做的事情。但是,当项目运行...

    Java团长

扫码关注云+社区

领取腾讯云代金券