谷歌draco
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文件,文件很小,壓縮的效率非常高,為了再可視化,所以再解壓,可視化的效果與原點云效果是一樣的,
? ? ?
???????????????????? 原點云 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 解碼后的點云
可視化的代碼
#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); }
如有問題可以與我交流,同時歡迎指正,謝謝
?
微信公眾號號可掃描二維碼一起共同學習交流
總結
- 上一篇: PCL点云配准(2)
- 下一篇: PCL的PNG文件和计算点云重心