691 lines
43 KiB
HTML
Raw Permalink Normal View History

<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Point Cloud Compression &mdash; Point Cloud Library 1.12.0 documentation</title>
<script type="text/javascript" src="_static/js/modernizr.min.js"></script>
<script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
<script type="text/javascript" src="_static/jquery.js"></script>
<script type="text/javascript" src="_static/underscore.js"></script>
<script type="text/javascript" src="_static/doctools.js"></script>
<script type="text/javascript" src="_static/language_data.js"></script>
<script type="text/javascript" src="_static/js/theme.js"></script>
<link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
<link rel="stylesheet" href="_static/pygments.css" type="text/css" />
<link rel="index" title="Index" href="genindex.html" />
<link rel="search" title="Search" href="search.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="index.html" class="icon icon-home"> Point Cloud Library
</a>
<div class="version">
1.12.0
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="search.html" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div>
<div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
<!-- Local TOC -->
<div class="local-toc"><ul>
<li><a class="reference internal" href="#">Point Cloud Compression</a></li>
<li><a class="reference internal" href="#the-code">The code:</a></li>
<li><a class="reference internal" href="#the-explanation">The explanation</a></li>
<li><a class="reference internal" href="#compiling-and-running-the-program">Compiling and running the program</a></li>
<li><a class="reference internal" href="#compression-profiles">Compression Profiles:</a></li>
<li><a class="reference internal" href="#advanced-parametrization">Advanced parametrization:</a></li>
<li><a class="reference internal" href="#command-line-tool-for-pcl-point-cloud-stream-compression">Command line tool for PCL point cloud stream compression</a></li>
<li><a class="reference internal" href="#conclusion">Conclusion</a></li>
</ul>
</div>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap">
<nav class="wy-nav-top" aria-label="top navigation">
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="index.html">Point Cloud Library</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="breadcrumbs navigation">
<ul class="wy-breadcrumbs">
<li><a href="index.html">Docs</a> &raquo;</li>
<li>Point Cloud Compression</li>
<li class="wy-breadcrumbs-aside">
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<div class="section" id="point-cloud-compression">
<span id="octree-compression"></span><h1>Point Cloud Compression</h1>
<p>Point clouds consist of huge data sets describing three dimensional points associated with
additional information such as distance, color, normals, etc. Additionally, they can be created at high rate and therefore occupy a significant amount
of memory resources. Once point clouds have to be stored or transmitted over rate-limited communication channels,
methods for compressing this kind of data become highly interesting. The Point Cloud Library provides point cloud compression functionality. It allows for encoding all kinds of point clouds including “unorganized” point clouds that are characterized by
non-existing point references, varying point size, resolution, density and/or point ordering. Furthermore, the underlying octree data structure
enables to efficiently merge point cloud data from several sources.</p>
<p><img alt="octreeCompression" src="_images/compression_tutorial.png" /></p>
<blockquote>
<div></div></blockquote>
<p>In the following, we explain how single point clouds as well
as streams of points clouds can be efficiently compressed.
In the presented example, we capture point clouds with the OpenNIGrabber to be compressed using the PCL point cloud compression techniques.</p>
</div>
<div class="section" id="the-code">
<h1>The code:</h1>
<p>First, create a file, lets say, <code class="docutils literal notranslate"><span class="pre">point_cloud_compression.cpp</span></code> and place the following inside it:</p>
<div class="highlight-cpp notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">&lt;pcl/point_cloud.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;pcl/point_types.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;pcl/io/openni_grabber.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;pcl/visualization/cloud_viewer.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;pcl/compression/octree_pointcloud_compression.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;sstream&gt;</span><span class="cp"></span>
<span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp"></span>
<span class="cp">#ifdef WIN32</span>
<span class="cp"># define sleep(x) Sleep((x)*1000)</span>
<span class="cp">#endif</span>
<span class="k">class</span> <span class="nc">SimpleOpenNIViewer</span>
<span class="p">{</span>
<span class="k">public</span><span class="o">:</span>
<span class="n">SimpleOpenNIViewer</span> <span class="p">()</span> <span class="o">:</span>
<span class="n">viewer</span> <span class="p">(</span><span class="s">&quot; Point Cloud Compression Example&quot;</span><span class="p">)</span>
<span class="p">{</span>
<span class="p">}</span>
<span class="kt">void</span>
<span class="n">cloud_cb_</span> <span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">ConstPtr</span> <span class="o">&amp;</span><span class="n">cloud</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">viewer</span><span class="p">.</span><span class="n">wasStopped</span> <span class="p">())</span>
<span class="p">{</span>
<span class="c1">// stringstream to store compressed point cloud</span>
<span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">compressedData</span><span class="p">;</span>
<span class="c1">// output pointcloud</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">Ptr</span> <span class="n">cloudOut</span> <span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;</span> <span class="p">());</span>
<span class="c1">// compress point cloud</span>
<span class="n">PointCloudEncoder</span><span class="o">-&gt;</span><span class="n">encodePointCloud</span> <span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="n">compressedData</span><span class="p">);</span>
<span class="c1">// decompress point cloud</span>
<span class="n">PointCloudDecoder</span><span class="o">-&gt;</span><span class="n">decodePointCloud</span> <span class="p">(</span><span class="n">compressedData</span><span class="p">,</span> <span class="n">cloudOut</span><span class="p">);</span>
<span class="c1">// show decompressed point cloud</span>
<span class="n">viewer</span><span class="p">.</span><span class="n">showCloud</span> <span class="p">(</span><span class="n">cloudOut</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span>
<span class="n">run</span> <span class="p">()</span>
<span class="p">{</span>
<span class="kt">bool</span> <span class="n">showStatistics</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="c1">// for a full list of profiles see: /io/include/pcl/compression/compression_profiles.h</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">compression_Profiles_e</span> <span class="n">compressionProfile</span> <span class="o">=</span> <span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">MED_RES_ONLINE_COMPRESSION_WITH_COLOR</span><span class="p">;</span>
<span class="c1">// instantiate point cloud compression for encoding and decoding</span>
<span class="n">PointCloudEncoder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">OctreePointCloudCompression</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">compressionProfile</span><span class="p">,</span> <span class="n">showStatistics</span><span class="p">);</span>
<span class="n">PointCloudDecoder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">OctreePointCloudCompression</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;</span> <span class="p">();</span>
<span class="c1">// create a new grabber for OpenNI devices</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">Grabber</span><span class="o">*</span> <span class="n">interface</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">OpenNIGrabber</span> <span class="p">();</span>
<span class="c1">// make callback function from member function</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="kt">void</span><span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">ConstPtr</span><span class="o">&amp;</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">f</span> <span class="o">=</span>
<span class="p">[</span><span class="k">this</span><span class="p">]</span> <span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">ConstPtr</span><span class="o">&amp;</span> <span class="n">cloud</span><span class="p">)</span> <span class="p">{</span> <span class="n">cloud_cb_</span> <span class="p">(</span><span class="n">cloud</span><span class="p">);</span> <span class="p">};</span>
<span class="c1">// connect callback function for desired signal. In this case its a point cloud with color values</span>
<span class="n">boost</span><span class="o">::</span><span class="n">signals2</span><span class="o">::</span><span class="n">connection</span> <span class="n">c</span> <span class="o">=</span> <span class="n">interface</span><span class="o">-&gt;</span><span class="n">registerCallback</span> <span class="p">(</span><span class="n">f</span><span class="p">);</span>
<span class="c1">// start receiving point clouds</span>
<span class="n">interface</span><span class="o">-&gt;</span><span class="n">start</span> <span class="p">();</span>
<span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">viewer</span><span class="p">.</span><span class="n">wasStopped</span> <span class="p">())</span>
<span class="p">{</span>
<span class="n">sleep</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">interface</span><span class="o">-&gt;</span><span class="n">stop</span> <span class="p">();</span>
<span class="c1">// delete point cloud compression instances</span>
<span class="k">delete</span> <span class="p">(</span><span class="n">PointCloudEncoder</span><span class="p">);</span>
<span class="k">delete</span> <span class="p">(</span><span class="n">PointCloudDecoder</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">visualization</span><span class="o">::</span><span class="n">CloudViewer</span> <span class="n">viewer</span><span class="p">;</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">OctreePointCloudCompression</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;*</span> <span class="n">PointCloudEncoder</span><span class="p">;</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">OctreePointCloudCompression</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;*</span> <span class="n">PointCloudDecoder</span><span class="p">;</span>
<span class="p">};</span>
<span class="kt">int</span>
<span class="nf">main</span> <span class="p">()</span>
<span class="p">{</span>
<span class="n">SimpleOpenNIViewer</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">run</span> <span class="p">();</span>
<span class="k">return</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</td></tr></table></div>
</div>
<div class="section" id="the-explanation">
<h1>The explanation</h1>
<p>Now, lets discuss the code in detail. Lets start at the main() function: First we create a new SimpleOpenNIViewer instance and call its run() method.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="kt">int</span>
<span class="nf">main</span> <span class="p">()</span>
<span class="p">{</span>
<span class="n">SimpleOpenNIViewer</span> <span class="n">v</span><span class="p">;</span>
<span class="n">v</span><span class="p">.</span><span class="n">run</span> <span class="p">();</span>
<span class="k">return</span> <span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
</pre></div>
</div>
<p>In the run() function, we create instances of the OctreePointCloudCompression class for encoding and decoding.
They can take compression profiles as an arguments for configuring the compression algorithm. The provided compression profiles predefine
common parameter sets for point clouds captured by openNI devices. In this example, we use the <strong>MED_RES_ONLINE_COMPRESSION_WITH_COLOR</strong> profile which
applies a coordinate encoding precision of 5 cubic millimeter and enables color component encoding. It is further optimized for fast online compression.
A full list of compression profiles including their configuration can be found in the file
“/io/include/pcl/compression/compression_profiles.h”.
A full parametrization of the compression algorithm is also possible in the OctreePointCloudCompression constructor using the MANUAL_CONFIGURATION profile.
For further details on advanced parametrization, please have a look at section “Advanced Parametrization”.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="kt">bool</span> <span class="n">showStatistics</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
<span class="c1">// for a full list of profiles see: /io/include/pcl/compression/compression_profiles.h</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">compression_Profiles_e</span> <span class="n">compressionProfile</span> <span class="o">=</span> <span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">MED_RES_ONLINE_COMPRESSION_WITH_COLOR</span><span class="p">;</span>
<span class="c1">// instantiate point cloud compression for encoding and decoding</span>
<span class="n">PointCloudEncoder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">OctreePointCloudCompression</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;</span> <span class="p">(</span><span class="n">compressionProfile</span><span class="p">,</span> <span class="n">showStatistics</span><span class="p">);</span>
<span class="n">PointCloudDecoder</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">io</span><span class="o">::</span><span class="n">OctreePointCloudCompression</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;</span> <span class="p">();</span>
</pre></div>
</div>
<p>The following code instantiates a new grabber for an OpenNI device and starts the interface callback loop.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="c1">// create a new grabber for OpenNI devices</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">Grabber</span><span class="o">*</span> <span class="n">interface</span> <span class="o">=</span> <span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">OpenNIGrabber</span> <span class="p">();</span>
<span class="c1">// make callback function from member function</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o">&lt;</span><span class="kt">void</span><span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">ConstPtr</span><span class="o">&amp;</span><span class="p">)</span><span class="o">&gt;</span> <span class="n">f</span> <span class="o">=</span>
<span class="p">[</span><span class="k">this</span><span class="p">]</span> <span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">ConstPtr</span><span class="o">&amp;</span> <span class="n">cloud</span><span class="p">)</span> <span class="p">{</span> <span class="n">cloud_cb_</span> <span class="p">(</span><span class="n">cloud</span><span class="p">);</span> <span class="p">};</span>
<span class="c1">// connect callback function for desired signal. In this case its a point cloud with color values</span>
<span class="n">boost</span><span class="o">::</span><span class="n">signals2</span><span class="o">::</span><span class="n">connection</span> <span class="n">c</span> <span class="o">=</span> <span class="n">interface</span><span class="o">-&gt;</span><span class="n">registerCallback</span> <span class="p">(</span><span class="n">f</span><span class="p">);</span>
<span class="c1">// start receiving point clouds</span>
<span class="n">interface</span><span class="o">-&gt;</span><span class="n">start</span> <span class="p">();</span>
<span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">viewer</span><span class="p">.</span><span class="n">wasStopped</span> <span class="p">())</span>
<span class="p">{</span>
<span class="n">sleep</span> <span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">interface</span><span class="o">-&gt;</span><span class="n">stop</span> <span class="p">();</span>
</pre></div>
</div>
<p>In the callback function executed by the OpenNIGrabber capture loop, we first compress the captured point cloud into a stringstream buffer. That follows a
decompression step, which decodes the compressed binary data into a new point cloud object. The decoded point cloud is then sent to the point cloud viewer.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="kt">void</span>
<span class="nf">cloud_cb_</span> <span class="p">(</span><span class="k">const</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">ConstPtr</span> <span class="o">&amp;</span><span class="n">cloud</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">viewer</span><span class="p">.</span><span class="n">wasStopped</span> <span class="p">())</span>
<span class="p">{</span>
<span class="c1">// stringstream to store compressed point cloud</span>
<span class="n">std</span><span class="o">::</span><span class="n">stringstream</span> <span class="n">compressedData</span><span class="p">;</span>
<span class="c1">// output pointcloud</span>
<span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;::</span><span class="n">Ptr</span> <span class="n">cloudOut</span> <span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o">&lt;</span><span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span><span class="o">&gt;</span> <span class="p">());</span>
<span class="c1">// compress point cloud</span>
<span class="n">PointCloudEncoder</span><span class="o">-&gt;</span><span class="n">encodePointCloud</span> <span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="n">compressedData</span><span class="p">);</span>
<span class="c1">// decompress point cloud</span>
<span class="n">PointCloudDecoder</span><span class="o">-&gt;</span><span class="n">decodePointCloud</span> <span class="p">(</span><span class="n">compressedData</span><span class="p">,</span> <span class="n">cloudOut</span><span class="p">);</span>
<span class="c1">// show decompressed point cloud</span>
<span class="n">viewer</span><span class="p">.</span><span class="n">showCloud</span> <span class="p">(</span><span class="n">cloudOut</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</div>
<div class="section" id="compiling-and-running-the-program">
<h1>Compiling and running the program</h1>
<p>Add the following lines to your CMakeLists.txt file:</p>
<div class="highlight-cmake notranslate"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12</pre></div></td><td class="code"><div class="highlight"><pre><span></span><span class="nb">cmake_minimum_required</span><span class="p">(</span><span class="s">VERSION</span> <span class="s">3.5</span> <span class="s">FATAL_ERROR</span><span class="p">)</span>
<span class="nb">project</span><span class="p">(</span><span class="s">point_cloud_compression</span><span class="p">)</span>
<span class="nb">find_package</span><span class="p">(</span><span class="s">PCL</span> <span class="s">1.2</span> <span class="s">REQUIRED</span><span class="p">)</span>
<span class="nb">include_directories</span><span class="p">(</span><span class="o">${</span><span class="nv">PCL_INCLUDE_DIRS</span><span class="o">}</span><span class="p">)</span>
<span class="nb">link_directories</span><span class="p">(</span><span class="o">${</span><span class="nv">PCL_LIBRARY_DIRS</span><span class="o">}</span><span class="p">)</span>
<span class="nb">add_definitions</span><span class="p">(</span><span class="o">${</span><span class="nv">PCL_DEFINITIONS</span><span class="o">}</span><span class="p">)</span>
<span class="nb">add_executable</span> <span class="p">(</span><span class="s">point_cloud_compression</span> <span class="s">point_cloud_compression.cpp</span><span class="p">)</span>
<span class="nb">target_link_libraries</span> <span class="p">(</span><span class="s">point_cloud_compression</span> <span class="o">${</span><span class="nv">PCL_LIBRARIES</span><span class="o">}</span><span class="p">)</span>
</pre></div>
</td></tr></table></div>
<p>After you have made the executable, you can run it. Simply do:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ ./point_cloud_compression
</pre></div>
</div>
<p>You will see something similar to:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>[OpenNIGrabber] Number devices connected: 1
[OpenNIGrabber] 1. device on bus 002:17 is a Xbox NUI Camera (2ae) from Microsoft (45e) with serial id &#39;B00364707960044B&#39;
[OpenNIGrabber] device_id is not set or has unknown format: ! Using first device.
[OpenNIGrabber] Opened &#39;Xbox NUI Camera&#39; on bus 2:17 with serial number &#39;B00364707960044B&#39;
streams alive: image, depth_image
*** POINTCLOUD ENCODING ***
Frame ID: 1
Encoding Frame: Intra frame
Number of encoded points: 192721
XYZ compression percentage: 3.91049%
XYZ bytes per point: 0.469259 bytes
Color compression percentage: 15.4717%
Color bytes per point: 0.618869 bytes
Size of uncompressed point cloud: 3011.27 kBytes
Size of compressed point cloud: 204 kBytes
Total bytes per point: 1.08813 bytes
Total compression percentage: 6.8008%
Compression ratio: 14.7042
*** POINTCLOUD ENCODING ***
Frame ID: 2
Encoding Frame: Prediction frame
Number of encoded points: 192721
XYZ compression percentage: 3.8132%
XYZ bytes per point: 0.457584 bytes
Color compression percentage: 15.5448%
Color bytes per point: 0.62179 bytes
Size of uncompressed point cloud: 3011.27 kBytes
Size of compressed point cloud: 203 kBytes
Total bytes per point: 1.07937 bytes
Total compression percentage: 6.74609%
Compression ratio: 14.8234
*** POINTCLOUD ENCODING ***
Frame ID: 3
Encoding Frame: Prediction frame
Number of encoded points: 192721
XYZ compression percentage: 3.79962%
XYZ bytes per point: 0.455954 bytes
Color compression percentage: 15.2121%
Color bytes per point: 0.608486 bytes
Size of uncompressed point cloud: 3011.27 kBytes
Size of compressed point cloud: 200 kBytes
Total bytes per point: 1.06444 bytes
Total compression percentage: 6.65275%
Compression ratio: 15.0314
...
</pre></div>
</div>
</div>
<div class="section" id="compression-profiles">
<h1>Compression Profiles:</h1>
<p>Compression profiles define parameter sets for the PCL point cloud encoder. They are optimized for compression of
common point clouds retrieved from the OpenNI grabber.
Please note, that the decoder does not need to be parametrized as it detects and adopts the configuration used during encoding.
The following compression profiles are available:</p>
<blockquote>
<div><ul class="simple">
<li><strong>LOW_RES_ONLINE_COMPRESSION_WITHOUT_COLOR</strong> 1 cubic centimeter resolution, no color, fast online encoding</li>
<li><strong>LOW_RES_ONLINE_COMPRESSION_WITH_COLOR</strong> 1 cubic centimeter resolution, color, fast online encoding</li>
<li><strong>MED_RES_ONLINE_COMPRESSION_WITHOUT_COLOR</strong> 5 cubic millimeter resolution, no color, fast online encoding</li>
<li><strong>MED_RES_ONLINE_COMPRESSION_WITH_COLOR</strong> 5 cubic millimeter resolution, color, fast online encoding</li>
<li><strong>HIGH_RES_ONLINE_COMPRESSION_WITHOUT_COLOR</strong> 1 cubic millimeter resolution, no color, fast online encoding</li>
<li><strong>HIGH_RES_ONLINE_COMPRESSION_WITH_COLOR</strong> 1 cubic millimeter resolution, color, fast online encoding</li>
<li><strong>LOW_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR</strong> 1 cubic centimeter resolution, no color, efficient offline encoding</li>
<li><strong>LOW_RES_OFFLINE_COMPRESSION_WITH_COLOR</strong> 1 cubic centimeter resolution, color, efficient offline encoding</li>
<li><strong>MED_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR</strong> 5 cubic millimeter resolution, no color, efficient offline encoding</li>
<li><strong>MED_RES_OFFLINE_COMPRESSION_WITH_COLOR</strong> 5 cubic millimeter resolution, color, efficient offline encoding</li>
<li><strong>HIGH_RES_OFFLINE_COMPRESSION_WITHOUT_COLOR</strong> 1 cubic millimeter resolution, no color, efficient offline encoding</li>
<li><strong>HIGH_RES_OFFLINE_COMPRESSION_WITH_COLOR</strong> 1 cubic millimeter resolution, color, efficient offline encoding</li>
<li><strong>MANUAL_CONFIGURATION</strong> enables manual configuration for advanced parametrization</li>
</ul>
</div></blockquote>
</div>
<div class="section" id="advanced-parametrization">
<h1>Advanced parametrization:</h1>
<p>In order to have full access to all compression related parameters, the constructor of the OctreePointCloudCompression class can initialized with additional
compression parameters. Please note, that for enabling advanced parametrization, the compressionProfile_arg argument <strong>needs</strong> to be set to <strong>MANUAL_CONFIGURATION</strong>.</p>
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="n">OctreePointCloudCompression</span> <span class="p">(</span><span class="n">compression_Profiles_e</span> <span class="n">compressionProfile_arg</span><span class="p">,</span>
<span class="kt">bool</span> <span class="n">showStatistics_arg</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">double</span> <span class="n">pointResolution_arg</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">double</span> <span class="n">octreeResolution_arg</span><span class="p">,</span>
<span class="kt">bool</span> <span class="n">doVoxelGridDownDownSampling_arg</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">iFrameRate_arg</span><span class="p">,</span>
<span class="kt">bool</span> <span class="n">doColorEncoding_arg</span><span class="p">,</span>
<span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">colorBitResolution_arg</span>
<span class="p">)</span>
</pre></div>
</div>
<p>The advanced parametrization is explained in the following:</p>
<blockquote>
<div><ul class="simple">
<li><strong>compressionProfile_arg</strong>: This parameter should be set to <strong>MANUAL_CONFIGURATION</strong> for enabling advanced parametrization.</li>
<li><strong>showStatistics_arg</strong>: Print compression related statistics to stdout.</li>
<li><strong>pointResolution_arg</strong>: Define coding precision for point coordinates. This parameter should be set to a value below the sensor noise.</li>
<li><strong>octreeResolution_arg</strong>: This parameter defines the voxel size of the deployed octree. A lower voxel resolution enables faster compression at, however,
decreased compression performance. This enables a trade-off between high frame/update rates and compression efficiency.</li>
<li><strong>doVoxelGridDownDownSampling_arg</strong>: If activated, only the hierarchical octree data structure is encoded. The decoder generated points at the voxel centers. In this
way, the point cloud becomes downsampled during compression while achieving high compression performance.</li>
<li><strong>iFrameRate_arg</strong>: The point cloud compression scheme differentially encodes point clouds. In this way, differences between the incoming point cloud and the previously encoded pointcloud is encoded in order to achieve maximum compression performance. The iFrameRate_arg allows to specify the rate of frames in the stream at which incoming point clouds are <strong>not</strong> differentially encoded (similar to I/P-frames in video coding).</li>
<li><strong>doColorEncoding_arg</strong>: This option enables color component encoding.</li>
<li><strong>colorBitResolution_arg</strong>: This parameter defines the amount of bits per color component to be encoded.</li>
</ul>
</div></blockquote>
</div>
<div class="section" id="command-line-tool-for-pcl-point-cloud-stream-compression">
<h1>Command line tool for PCL point cloud stream compression</h1>
<p>The pcl apps component contains a command line tool for point cloud compression
and streaming: Simply execute “./pcl_openni_octree_compression -?” to see a full
list of options (note: the output on screen may differ):</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">PCL</span> <span class="n">point</span> <span class="n">cloud</span> <span class="n">stream</span> <span class="n">compression</span>
<span class="n">usage</span><span class="p">:</span> <span class="o">./</span><span class="n">pcl_openni_octree_compression</span> <span class="p">[</span><span class="n">mode</span><span class="p">]</span> <span class="p">[</span><span class="n">profile</span><span class="p">]</span> <span class="p">[</span><span class="n">parameters</span><span class="p">]</span>
<span class="n">I</span><span class="o">/</span><span class="n">O</span><span class="p">:</span>
<span class="o">-</span><span class="n">f</span> <span class="n">file</span> <span class="p">:</span> <span class="n">file</span> <span class="n">name</span>
<span class="n">file</span> <span class="n">compression</span> <span class="n">mode</span><span class="p">:</span>
<span class="o">-</span><span class="n">x</span><span class="p">:</span> <span class="n">encode</span> <span class="n">point</span> <span class="n">cloud</span> <span class="n">stream</span> <span class="n">to</span> <span class="n">file</span>
<span class="o">-</span><span class="n">d</span><span class="p">:</span> <span class="n">decode</span> <span class="kn">from</span> <span class="nn">file</span> <span class="ow">and</span> <span class="n">display</span> <span class="n">point</span> <span class="n">cloud</span> <span class="n">stream</span>
<span class="n">network</span> <span class="n">streaming</span> <span class="n">mode</span><span class="p">:</span>
<span class="o">-</span><span class="n">s</span> <span class="p">:</span> <span class="n">start</span> <span class="n">server</span> <span class="n">on</span> <span class="n">localhost</span>
<span class="o">-</span><span class="n">c</span> <span class="n">host</span> <span class="p">:</span> <span class="n">connect</span> <span class="n">to</span> <span class="n">server</span> <span class="ow">and</span> <span class="n">display</span> <span class="n">decoded</span> <span class="n">cloud</span> <span class="n">stream</span>
<span class="n">optional</span> <span class="n">compression</span> <span class="n">profile</span><span class="p">:</span>
<span class="o">-</span><span class="n">p</span> <span class="n">profile</span> <span class="p">:</span> <span class="n">select</span> <span class="n">compression</span> <span class="n">profile</span><span class="p">:</span>
<span class="o">-</span><span class="s2">&quot;lowC&quot;</span> <span class="n">Low</span> <span class="n">resolution</span> <span class="k">with</span> <span class="n">color</span>
<span class="o">-</span><span class="s2">&quot;lowNC&quot;</span> <span class="n">Low</span> <span class="n">resolution</span> <span class="n">without</span> <span class="n">color</span>
<span class="o">-</span><span class="s2">&quot;medC&quot;</span> <span class="n">Medium</span> <span class="n">resolution</span> <span class="k">with</span> <span class="n">color</span>
<span class="o">-</span><span class="s2">&quot;medNC&quot;</span> <span class="n">Medium</span> <span class="n">resolution</span> <span class="n">without</span> <span class="n">color</span>
<span class="o">-</span><span class="s2">&quot;highC&quot;</span> <span class="n">High</span> <span class="n">resolution</span> <span class="k">with</span> <span class="n">color</span>
<span class="o">-</span><span class="s2">&quot;highNC&quot;</span> <span class="n">High</span> <span class="n">resolution</span> <span class="n">without</span> <span class="n">color</span>
<span class="n">optional</span> <span class="n">compression</span> <span class="n">parameters</span><span class="p">:</span>
<span class="o">-</span><span class="n">r</span> <span class="n">prec</span> <span class="p">:</span> <span class="n">point</span> <span class="n">precision</span>
<span class="o">-</span><span class="n">o</span> <span class="n">prec</span> <span class="p">:</span> <span class="n">octree</span> <span class="n">voxel</span> <span class="n">size</span>
<span class="o">-</span><span class="n">v</span> <span class="p">:</span> <span class="n">enable</span> <span class="n">voxel</span><span class="o">-</span><span class="n">grid</span> <span class="n">downsampling</span>
<span class="o">-</span><span class="n">a</span> <span class="p">:</span> <span class="n">enable</span> <span class="n">color</span> <span class="n">coding</span>
<span class="o">-</span><span class="n">i</span> <span class="n">rate</span> <span class="p">:</span> <span class="n">i</span><span class="o">-</span><span class="n">frame</span> <span class="n">rate</span>
<span class="o">-</span><span class="n">b</span> <span class="n">bits</span> <span class="p">:</span> <span class="n">bits</span><span class="o">/</span><span class="n">color</span> <span class="n">component</span>
<span class="o">-</span><span class="n">t</span> <span class="p">:</span> <span class="n">output</span> <span class="n">statistics</span>
<span class="o">-</span><span class="n">e</span> <span class="p">:</span> <span class="n">show</span> <span class="nb">input</span> <span class="n">cloud</span> <span class="n">during</span> <span class="n">encoding</span>
<span class="n">example</span><span class="p">:</span>
<span class="o">./</span><span class="n">pcl_openni_octree_compression</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">p</span> <span class="n">highC</span> <span class="o">-</span><span class="n">t</span> <span class="o">-</span><span class="n">f</span> <span class="n">pc_compressed</span><span class="o">.</span><span class="n">pcc</span>
</pre></div>
</div>
<p>In order to stream compressed point cloud via TCP/IP, you can start the server with:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ ./pcl_openni_octree_compression -s
</pre></div>
</div>
<p>It will listen on port 6666 for incoming connections. Now start the client with:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>$ ./pcl_openni_octree_compression -c SERVER_NAME
</pre></div>
</div>
<p>and remotely captured point clouds will be locally shown in the point cloud viewer.</p>
</div>
<div class="section" id="conclusion">
<h1>Conclusion</h1>
<p>This PCL point cloud compression enables to efficiently compress point clouds of any type and point cloud streams.</p>
</div>
</div>
</div>
<footer>
<hr/>
<div role="contentinfo">
<p>
&copy; Copyright
</p>
</div>
Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
</footer>
</div>
</div>
</section>
</div>
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>