前不久,谷歌开源的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文件,文件很小,压缩的效率非常高,为了再可视化,所以再解压,可视化的效果与原点云效果是一样的,

     

原点云                                                                                                                 解码后的点云

可视化的代码

  1. #include <iostream> //标准C++库中的输入输出的头文件
  2. #include <pcl/io/pcd_io.h> //PCD读写类相关的头文件
  3. #include <pcl/point_types.h> //PCL中支持的点类型的头文件
  4. #include <pcl/io/ply_io.h>
  5. #include <boost/thread/thread.hpp>
  6. #include <pcl/visualization/pcl_visualizer.h>
  7.  
  8. int
  9. main (int argc, char** argv)
  10. {
  11. //创建一个PointCloud<pcl::PointXYZ> boost共享指针并进行实例化
  12. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);
  13.  
  14. //打开点云文件
  15. if (pcl::io::loadPLYFile<pcl::PointXYZ> ("bun_zipper.ply", *cloud) == -)
  16. {
  17. PCL_ERROR ("Couldn't read file bun_zipper.ply \n");
  18. return (-);
  19. }
  20.  
  21. std::cout << "Loaded "
  22. << cloud->width * cloud->height
  23. << " data points from bun_zipper.ply with the following fields: "
  24. << std::endl;
  25.  
  26. boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("cloud"));
  27. viewer->addPointCloud<pcl::PointXYZ>(cloud,"cloud");
  28.  
  29. while(!viewer->wasStopped())
  30. {
  31. viewer->spinOnce();
  32. boost::this_thread::sleep(boost::posix_time::microseconds());
  33. }
  34. return ();
  35. }

如有问题可以与我交流,同时欢迎指正,谢谢

微信公众号号可扫描二维码一起共同学习交流

谷歌draco的更多相关文章

  1. 3.Kali 1.0 / 2.0 安装中文输入法(谷歌pinyin + 其他)

    1.kali默认是没有中午输入法的,需要自己安装一下 2.首先我们先获取root权限 dnt@HackerKali:~$ su密码: 3.安装中文输入法(apt-get 指令不会的同学可以学习一下基础 ...

  2. c# (ENUM)枚举组合类型的谷歌序列化Protobuf

    c# (ENUM)枚举组合类型的谷歌序列化Protobuf,必须在序列化/反序列化时加上下面: RuntimeTypeModel.Default[typeof(Alarm)].EnumPassthru ...

  3. 结合谷歌地图多边形(polygon)与Sql Server 2008的空间数据类型计算某个点是否在多边形内的注意事项

    首先在利用 GEOGRAPHY::STPolyFromText(@GeoStr, 4326) 这样的函数把字符串转换为Geography类型时,字符串里经纬度的顺序是 “经度[空格]纬度”,即“lon ...

  4. .NET开发笔记(二十三) 谷歌地图下载

    关于如何将地球经纬度坐标系统转换成程序中常用到的平面2D坐标系统,网上的文章很多,参考http://www.cnblogs.com/beniao/archive/2010/04/18/1714544. ...

  5. 谷歌chrome浏览器www.tradeadexchange.com广告弹窗跳转劫持病毒

    近期大量网友出现chrome浏览器被劫持的情况,表现如下:           ·  点击(访问)任意网站任意链接均有概率弹出www.tradeadexchange.com.           ·  ...

  6. 【源码】谷歌代理~WPF简单小软件-2015-10-15首发 (2016-03-01已更新源)

    蛋疼,昨天把代理去了后才发现,原来咱们连谷歌应用都访问不了,,,用别人的总觉得不怎么安全,然后今天早上就编了个小软件干掉他这限制==>  GoogleProxy.exe [主要目的:为了能在线安 ...

  7. [转]9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路

    1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...

  8. 【读书笔记】2016.11.19 北航 《GDG 谷歌开发者大会》整理

    2016.11.19 周六,我们在 北航参加了<GDG 谷歌开发者大会>,在web专场,聆听了谷歌公司的与会专家的技术分享. 中午免费的午餐,下午精美的下午茶,还有精湛的技术,都是我们队谷 ...

  9. 用Lua扩展谷歌拼音输入法

    谷歌拼音输入法最后一次更新是2013年,最近2年毫无动静,这个产品应该已经停了,不过这并不影响对它的使用,我一直喜欢它的简洁和稳定. 说不上来什么原因,忽然想起了摆弄摆弄谷歌拼音输入法的扩展特性(我经 ...

  10. 谷歌地图地理解析和反解析geocode.geocoder详解

    地址解析就是将地址(如:贵州省贵阳市)转换为地理坐标(如经度:106.71,纬度:26.57)的过程. 地理反解析和上面的过程相反是将地理坐标(如纬度:26.57,经度:106.71)转换为地址(中国 ...

随机推荐

  1. django 模板语言入门详解

    django 模板语言所解决的问题域: 1.动态生成html文件 2.是上这个模板语言用可用于生成任何形式的文本文件 从一个不用模板语言生成html的例子看模板语言的优点: 假设我要生成一个 “hel ...

  2. 使用 Zipkin 和 Brave 实现分布式系统追踪(基础篇)

    一.Zipkin 1.1.简介 Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twi ...

  3. javaweb下载文件

    //读取文件->写出文件 public static void main(String[] args) { InputStream in =null; OutputStream out = nu ...

  4. nginx configure fastdfs + SSL

    ./configure \ --prefix=/usr/local/nginx \ --with-http_stub_status_module \ --with-http_ssl_module \ ...

  5. regularization

    https://www.zhihu.com/question/20924039 http://52opencourse.com/133/coursera%E5%85%AC%E5%BC%80%E8%AF ...

  6. python(47):range和xrange的区别和联系

    range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. 比如: >>> range(5)[0, 1, 2, ...

  7. u3d中的坐标系

    任何子级游戏对象 (Child GameObject) 的检视器 (Inspector) 中的变换 (Transform) 值都会相对于父级 (Parent) 的变换 (Transform) 值而显示 ...

  8. 使用PostgreSQL遇到的一个问题[column does not exist]字段不存在:

    表结构: 在我上面的表结构中,明明有一个叫做"fromdeviceId"的字段,但是查询的时候却提示找不到该字段: 仔细观察错误信息,发现,我的字段明明是有一个大写字母(fromd ...

  9. c++ primer读书笔记之c++11(三)

    1 =default构造函数限定符 c++11针对构造函数提供了=default限定符,可以用于显式指定编译器自动生成特定的构造函数.析构或赋值运算函数.参考代码如下: class CtorDftTy ...

  10. shell格式化字符串

    假如你有以下代码: TEMP_SQL="SELECT count(uid) from ${TABLE_PREFIX}_%s;" SUM= for((i=${MIN};i<${ ...