629 lines
47 KiB
HTML
629 lines
47 KiB
HTML
|
||
|
||
<!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>Create a PCL visualizer in Qt with cmake — 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="#">Create a PCL visualizer in Qt with cmake</a><ul>
|
||
<li><a class="reference internal" href="#the-project">The project</a></li>
|
||
<li><a class="reference internal" href="#qt-configuration">Qt configuration</a></li>
|
||
<li><a class="reference internal" href="#user-interface-ui">User interface (UI)</a></li>
|
||
<li><a class="reference internal" href="#the-code">The code</a><ul>
|
||
<li><a class="reference internal" href="#main-cpp">main.cpp</a></li>
|
||
<li><a class="reference internal" href="#pclviewer-h">pclviewer.h</a></li>
|
||
<li><a class="reference internal" href="#pclviewer-cpp">pclviewer.cpp</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#compiling-and-running">Compiling and running</a></li>
|
||
<li><a class="reference internal" href="#more-on-qt-and-pcl">More on Qt and PCL</a></li>
|
||
</ul>
|
||
</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> »</li>
|
||
|
||
<li>Create a PCL visualizer in Qt with cmake</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="create-a-pcl-visualizer-in-qt-with-cmake">
|
||
<span id="qt-visualizer"></span><h1><a class="toc-backref" href="#id1">Create a PCL visualizer in Qt with cmake</a></h1>
|
||
<p>In this tutorial we will learn how to create a PCL + Qt project, we will use Cmake rather than Qmake.The program we are going to
|
||
write is a simple PCL visualizer which allow to change a randomly generated point cloud color.</p>
|
||
<div class="line-block">
|
||
<div class="line">The tutorial was tested on Linux Ubuntu 12.04 and 14.04. It also seems to be working fine on Windows 8.1 x64.</div>
|
||
<div class="line">Feel free to push modifications into the git repo to make this code/tutorial compatible with your platform !</div>
|
||
</div>
|
||
<div class="contents topic" id="contents">
|
||
<p class="topic-title">Contents</p>
|
||
<ul class="simple">
|
||
<li><a class="reference internal" href="#create-a-pcl-visualizer-in-qt-with-cmake" id="id1">Create a PCL visualizer in Qt with cmake</a><ul>
|
||
<li><a class="reference internal" href="#the-project" id="id2">The project</a></li>
|
||
<li><a class="reference internal" href="#qt-configuration" id="id3">Qt configuration</a></li>
|
||
<li><a class="reference internal" href="#user-interface-ui" id="id4">User interface (UI)</a></li>
|
||
<li><a class="reference internal" href="#the-code" id="id5">The code</a><ul>
|
||
<li><a class="reference internal" href="#main-cpp" id="id6">main.cpp</a></li>
|
||
<li><a class="reference internal" href="#pclviewer-h" id="id7">pclviewer.h</a></li>
|
||
<li><a class="reference internal" href="#pclviewer-cpp" id="id8">pclviewer.cpp</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><a class="reference internal" href="#compiling-and-running" id="id9">Compiling and running</a></li>
|
||
<li><a class="reference internal" href="#more-on-qt-and-pcl" id="id10">More on Qt and PCL</a></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
<div class="section" id="the-project">
|
||
<h2><a class="toc-backref" href="#id2">The project</a></h2>
|
||
<p>For this project Qt is of course mandatory, make sure it is installed and PCL deals with it.
|
||
<a class="reference external" href="http://qt-project.org/doc/qt-4.8/qmake-manual.html">qmake</a> is a tool that helps simplify the build process for development project across different platforms,
|
||
we will use <a class="reference external" href="https://en.wikipedia.org/wiki/CMake">cmake</a> instead because most projects in PCL uses cmake and it is simpler in my opinion.</p>
|
||
<p>This is how I organized the project: the build folder contains all built files and the src folder holds all sources files</p>
|
||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>.
|
||
├── build
|
||
└── src
|
||
├── CMakeLists.txt
|
||
├── main.cpp
|
||
├── pclviewer.cpp
|
||
├── pclviewer.h
|
||
├── pclviewer.ui
|
||
└── pcl_visualizer.pro
|
||
</pre></div>
|
||
</div>
|
||
<p>If you want to change this layout you will have to do minor modifications in the code, especially line 2 of <code class="docutils literal notranslate"><span class="pre">pclviewer.cpp</span></code>
|
||
Create the folder tree and download the sources files from <a class="reference external" href="https://github.com/PointCloudLibrary/pcl/tree/master/doc/tutorials/content/sources/qt_visualizer">github</a>.</p>
|
||
<div class="admonition note">
|
||
<p class="first admonition-title">Note</p>
|
||
<p class="last">File paths should not contain any special character or the compilation might fail with a <code class="docutils literal notranslate"><span class="pre">moc:</span> <span class="pre">Cannot</span> <span class="pre">open</span> <span class="pre">options</span> <span class="pre">file</span> <span class="pre">specified</span> <span class="pre">with</span> <span class="pre">@</span></code> error message.</p>
|
||
</div>
|
||
</div>
|
||
<div class="section" id="qt-configuration">
|
||
<h2><a class="toc-backref" href="#id3">Qt configuration</a></h2>
|
||
<dl class="docutils">
|
||
<dt>First we will take a look at how Qt is configured to build this project. Simply open <code class="docutils literal notranslate"><span class="pre">pcl_visualizer.pro</span></code> with Qt (or double click on the file)</dt>
|
||
<dd>and go to the <strong>Projects</strong> tab</dd>
|
||
</dl>
|
||
<a class="reference internal image-reference" href="_images/qt_config.png"><img alt="_images/qt_config.png" src="_images/qt_config.png" style="height: 757px;" /></a>
|
||
<p>In this example note that I deleted the <strong>Debug</strong> configuration and only kept the <strong>Release</strong> config.
|
||
Use relative paths like this is better than absolute paths; this project should work wherever it has been put.</p>
|
||
<p>We specify in the general section that we want to build in the folder <code class="docutils literal notranslate"><span class="pre">../build</span></code> (this is a relative path from the <code class="docutils literal notranslate"><span class="pre">.pro</span></code> file).</p>
|
||
<p>The first step of the building is to call <code class="docutils literal notranslate"><span class="pre">cmake</span></code> (from the <code class="docutils literal notranslate"><span class="pre">build</span></code> folder) with argument <code class="docutils literal notranslate"><span class="pre">../src</span></code>; this is gonna create all files in the
|
||
<code class="docutils literal notranslate"><span class="pre">build</span></code> folder without modifying anything in the <code class="docutils literal notranslate"><span class="pre">src</span></code> foler; thus keeping it clean.</p>
|
||
<p>Then we just have to compile our program; the argument <code class="docutils literal notranslate"><span class="pre">-j2</span></code> allow to specify how many thread of your CPU you want to use for compilation. The more thread you use
|
||
the faster the compilation will be (especially on big projects); but if you take all threads from the CPU your OS will likely be unresponsive during
|
||
the compilation process.
|
||
See <a class="reference external" href="http://www.pointclouds.org/documentation/advanced/compiler_optimizations.php#compiler-optimizations">compiler optimizations</a> for more information.</p>
|
||
<p>If you don’t want to use Qt Creator but Eclipse instead; see <a class="reference external" href="http://www.pointclouds.org/documentation/tutorials/using_pcl_with_eclipse.php#using-pcl-with-eclipse">using PCL with Eclipse</a>.</p>
|
||
</div>
|
||
<div class="section" id="user-interface-ui">
|
||
<h2><a class="toc-backref" href="#id4">User interface (UI)</a></h2>
|
||
<p>The point of using Qt for your projects is that you can easily build cross-platform UIs. The UI is held in the <code class="docutils literal notranslate"><span class="pre">.ui</span></code> file
|
||
You can open it with a text editor or with Qt Creator, in this example the UI is very simple and it consists of :</p>
|
||
<blockquote>
|
||
<div><ul class="simple">
|
||
<li><a class="reference external" href="http://qt-project.org/doc/qt-4.8/qmainwindow.html">QMainWindow</a>, QWidget: the window (frame) of your application</li>
|
||
<li>qvtkWidget: The VTK widget which holds the PCLVisualizer</li>
|
||
<li><a class="reference external" href="http://qt-project.org/doc/qt-4.8/qlabel.html">QLabel</a>: Display text on the user interface</li>
|
||
<li><a class="reference external" href="http://qt-project.org/doc/qt-4.8/qslider.html">QSlider</a>: A slider to choose a value (here; an integer value)</li>
|
||
<li><a class="reference external" href="http://qt-project.org/doc/qt-4.8/qlcdnumber.html">QLCDNumber</a>: A digital display, 8 segment styled</li>
|
||
</ul>
|
||
</div></blockquote>
|
||
<a class="reference internal image-reference" href="_images/ui1.png"><img alt="_images/ui1.png" src="_images/ui1.png" style="height: 518px;" /></a>
|
||
<p>If you click on Edit <a class="reference external" href="http://qt-project.org/doc/qt-4.8/signalsandslots.html">Signals/Slots</a> at the top of the Qt window you will see the relationships
|
||
between some of the UI objects. In our example the sliderMoved(int) signal is connected to the display(int) slot; this means that everytime we move the slider
|
||
the digital display is updated accordingly to the slider value.</p>
|
||
</div>
|
||
<div class="section" id="the-code">
|
||
<h2><a class="toc-backref" href="#id5">The code</a></h2>
|
||
<p>Now, let’s break down the code piece by piece.</p>
|
||
<div class="section" id="main-cpp">
|
||
<h3><a class="toc-backref" href="#id6">main.cpp</a></h3>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">"pclviewer.h"</span><span class="cp"></span>
|
||
<span class="cp">#include</span> <span class="cpf"><QApplication></span><span class="cp"></span>
|
||
<span class="cp">#include</span> <span class="cpf"><QMainWindow></span><span class="cp"></span>
|
||
|
||
<span class="kt">int</span> <span class="nf">main</span> <span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span> <span class="o">*</span><span class="n">argv</span><span class="p">[])</span>
|
||
<span class="p">{</span>
|
||
<span class="n">QApplication</span> <span class="n">a</span> <span class="p">(</span><span class="n">argc</span><span class="p">,</span> <span class="n">argv</span><span class="p">);</span>
|
||
<span class="n">PCLViewer</span> <span class="n">w</span><span class="p">;</span>
|
||
<span class="n">w</span><span class="p">.</span><span class="n">show</span> <span class="p">();</span>
|
||
|
||
<span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">exec</span> <span class="p">();</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">Here we include the headers for the class PCLViewer and the headers for QApplication and QMainWindow.</div>
|
||
<div class="line">Then the main functions consists of instantiating a QApplication <cite>a</cite> which manages the GUI application’s control flow and main settings.</div>
|
||
<div class="line">A <code class="docutils literal notranslate"><span class="pre">PCLViewer</span></code> object called <cite>w</cite> is instantiated and it’s method <code class="docutils literal notranslate"><span class="pre">show()</span></code> is called.</div>
|
||
<div class="line">Finally we return the state of our program exit through the QApplication <cite>a</cite>.</div>
|
||
</div>
|
||
</div>
|
||
<div class="section" id="pclviewer-h">
|
||
<h3><a class="toc-backref" href="#id7">pclviewer.h</a></h3>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#pragma once</span>
|
||
|
||
<span class="cp">#include</span> <span class="cpf"><iostream></span><span class="cp"></span>
|
||
|
||
<span class="c1">// Qt</span>
|
||
<span class="cp">#include</span> <span class="cpf"><QMainWindow></span><span class="cp"></span>
|
||
|
||
<span class="c1">// Point Cloud Library</span>
|
||
<span class="cp">#include</span> <span class="cpf"><pcl/point_cloud.h></span><span class="cp"></span>
|
||
<span class="cp">#include</span> <span class="cpf"><pcl/point_types.h></span><span class="cp"></span>
|
||
<span class="cp">#include</span> <span class="cpf"><pcl/visualization/pcl_visualizer.h></span><span class="cp"></span>
|
||
|
||
<span class="c1">// Visualization Toolkit (VTK)</span>
|
||
<span class="cp">#include</span> <span class="cpf"><vtkRenderWindow.h></span><span class="cp"></span>
|
||
|
||
<span class="k">typedef</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointXYZRGBA</span> <span class="n">PointT</span><span class="p">;</span>
|
||
<span class="k">typedef</span> <span class="n">pcl</span><span class="o">::</span><span class="n">PointCloud</span><span class="o"><</span><span class="n">PointT</span><span class="o">></span> <span class="n">PointCloudT</span><span class="p">;</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>This file is the header for the class PCLViewer; we include <code class="docutils literal notranslate"><span class="pre">QMainWindow</span></code> because this class contains UI elements, we include the PCL headers we will
|
||
be using and the VTK header for the <code class="docutils literal notranslate"><span class="pre">qvtkWidget</span></code>. We also define typedefs of the point types and point clouds, this improves readabily.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="k">namespace</span> <span class="n">Ui</span>
|
||
<span class="p">{</span>
|
||
<span class="k">class</span> <span class="nc">PCLViewer</span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>We declare the namespace <code class="docutils literal notranslate"><span class="pre">Ui</span></code> and the class PCLViewer inside it.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="k">class</span> <span class="nc">PCLViewer</span> <span class="o">:</span> <span class="k">public</span> <span class="n">QMainWindow</span>
|
||
<span class="p">{</span>
|
||
<span class="n">Q_OBJECT</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>This is the definition of the PCLViewer class; the macro <code class="docutils literal notranslate"><span class="pre">Q_OBJECT</span></code> tells the compiler that this object contains UI elements;
|
||
this imply that this file will be processed through <a class="reference external" href="http://qt-project.org/doc/qt-4.8/moc.html">the Meta-Object Compiler (moc)</a>.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="k">public</span><span class="o">:</span>
|
||
<span class="k">explicit</span> <span class="n">PCLViewer</span> <span class="p">(</span><span class="n">QWidget</span> <span class="o">*</span><span class="n">parent</span> <span class="o">=</span> <span class="mi">0</span><span class="p">);</span>
|
||
<span class="o">~</span><span class="n">PCLViewer</span> <span class="p">();</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The constructor and destructor of the PCLViewer class.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="k">public</span> <span class="nl">Q_SLOTS</span><span class="p">:</span>
|
||
<span class="kt">void</span>
|
||
<span class="n">randomButtonPressed</span> <span class="p">();</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="nf">RGBsliderReleased</span> <span class="p">();</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="nf">pSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">);</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="nf">redSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">);</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="nf">greenSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">);</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="nf">blueSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>These are the public slots; these functions will be linked with UI elements actions.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="k">protected</span><span class="o">:</span>
|
||
<span class="n">pcl</span><span class="o">::</span><span class="n">visualization</span><span class="o">::</span><span class="n">PCLVisualizer</span><span class="o">::</span><span class="n">Ptr</span> <span class="n">viewer</span><span class="p">;</span>
|
||
<span class="n">PointCloudT</span><span class="o">::</span><span class="n">Ptr</span> <span class="n">cloud</span><span class="p">;</span>
|
||
|
||
<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">red</span><span class="p">;</span>
|
||
<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">green</span><span class="p">;</span>
|
||
<span class="kt">unsigned</span> <span class="kt">int</span> <span class="n">blue</span><span class="p">;</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">A boost shared pointer to a PCLVisualier and a pointer to a point cloud are defined here.</div>
|
||
<div class="line">The integers <code class="docutils literal notranslate"><span class="pre">red</span></code>, <code class="docutils literal notranslate"><span class="pre">green</span></code>, <code class="docutils literal notranslate"><span class="pre">blue</span></code> will help us store the value of the sliders.</div>
|
||
</div>
|
||
</div>
|
||
<div class="section" id="pclviewer-cpp">
|
||
<h3><a class="toc-backref" href="#id8">pclviewer.cpp</a></h3>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span> <span class="cpf">"pclviewer.h"</span><span class="cp"></span>
|
||
<span class="cp">#include</span> <span class="cpf">"ui_pclviewer.h"</span><span class="cp"></span>
|
||
|
||
<span class="n">PCLViewer</span><span class="o">::</span><span class="n">PCLViewer</span> <span class="p">(</span><span class="n">QWidget</span> <span class="o">*</span><span class="n">parent</span><span class="p">)</span> <span class="o">:</span>
|
||
<span class="n">QMainWindow</span> <span class="p">(</span><span class="n">parent</span><span class="p">),</span>
|
||
<span class="n">ui</span> <span class="p">(</span><span class="k">new</span> <span class="n">Ui</span><span class="o">::</span><span class="n">PCLViewer</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">ui</span><span class="o">-></span><span class="n">setupUi</span> <span class="p">(</span><span class="k">this</span><span class="p">);</span>
|
||
<span class="k">this</span><span class="o">-></span><span class="n">setWindowTitle</span> <span class="p">(</span><span class="s">"PCL viewer"</span><span class="p">);</span>
|
||
|
||
<span class="c1">// Setup the cloud pointer</span>
|
||
<span class="n">cloud</span><span class="p">.</span><span class="n">reset</span> <span class="p">(</span><span class="k">new</span> <span class="n">PointCloudT</span><span class="p">);</span>
|
||
<span class="c1">// The number of points in the cloud</span>
|
||
<span class="n">cloud</span><span class="o">-></span><span class="n">points</span><span class="p">.</span><span class="n">resize</span> <span class="p">(</span><span class="mi">200</span><span class="p">);</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>We include the class header and the header for the UI object; note that this file is generated by the moc and it’s path depend on
|
||
where you call cmake !</p>
|
||
<p>After that is the constructor implementation; we setup the ui and the window title name.
|
||
| Then we initialize the cloud pointer member of the class at a newly allocated point cloud pointer.
|
||
| The cloud is resized to be able to hold 200 points.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="c1">// The default color</span>
|
||
<span class="n">red</span> <span class="o">=</span> <span class="mi">128</span><span class="p">;</span>
|
||
<span class="n">green</span> <span class="o">=</span> <span class="mi">128</span><span class="p">;</span>
|
||
<span class="n">blue</span> <span class="o">=</span> <span class="mi">128</span><span class="p">;</span>
|
||
|
||
<span class="c1">// Fill the cloud with some points</span>
|
||
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">point</span><span class="p">:</span> <span class="o">*</span><span class="n">cloud</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">1024</span> <span class="o">*</span> <span class="n">rand</span> <span class="p">()</span> <span class="o">/</span> <span class="p">(</span><span class="n">RAND_MAX</span> <span class="o">+</span> <span class="mf">1.0f</span><span class="p">);</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">y</span> <span class="o">=</span> <span class="mi">1024</span> <span class="o">*</span> <span class="n">rand</span> <span class="p">()</span> <span class="o">/</span> <span class="p">(</span><span class="n">RAND_MAX</span> <span class="o">+</span> <span class="mf">1.0f</span><span class="p">);</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="mi">1024</span> <span class="o">*</span> <span class="n">rand</span> <span class="p">()</span> <span class="o">/</span> <span class="p">(</span><span class="n">RAND_MAX</span> <span class="o">+</span> <span class="mf">1.0f</span><span class="p">);</span>
|
||
|
||
<span class="n">point</span><span class="p">.</span><span class="n">r</span> <span class="o">=</span> <span class="n">red</span><span class="p">;</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">g</span> <span class="o">=</span> <span class="n">green</span><span class="p">;</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">b</span> <span class="o">=</span> <span class="n">blue</span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line"><code class="docutils literal notranslate"><span class="pre">red</span></code> <code class="docutils literal notranslate"><span class="pre">green</span></code> and <code class="docutils literal notranslate"><span class="pre">blue</span></code> protected members are initialized to their default values.</div>
|
||
<div class="line">The cloud is filled with random points (in a cube) and accordingly to <code class="docutils literal notranslate"><span class="pre">red</span></code> <code class="docutils literal notranslate"><span class="pre">green</span></code> and <code class="docutils literal notranslate"><span class="pre">blue</span></code> colors.</div>
|
||
</div>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="c1">// Set up the QVTK window</span>
|
||
<span class="n">viewer</span><span class="p">.</span><span class="n">reset</span> <span class="p">(</span><span class="k">new</span> <span class="n">pcl</span><span class="o">::</span><span class="n">visualization</span><span class="o">::</span><span class="n">PCLVisualizer</span> <span class="p">(</span><span class="s">"viewer"</span><span class="p">,</span> <span class="nb">false</span><span class="p">));</span>
|
||
<span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">SetRenderWindow</span> <span class="p">(</span><span class="n">viewer</span><span class="o">-></span><span class="n">getRenderWindow</span> <span class="p">());</span>
|
||
<span class="n">viewer</span><span class="o">-></span><span class="n">setupInteractor</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">GetInteractor</span> <span class="p">(),</span> <span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">GetRenderWindow</span> <span class="p">());</span>
|
||
<span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">update</span> <span class="p">();</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">Here we create a PCL Visualizer name <code class="docutils literal notranslate"><span class="pre">viewer</span></code> and we also specify that we don’t want an interactor to be created.</div>
|
||
<div class="line">We don’t want an interactor to be created because our <code class="docutils literal notranslate"><span class="pre">qvtkWidget</span></code> is already an interactor and it’s the one we want to use.</div>
|
||
<div class="line">So the next step is to configure our newly created PCL Visualiser interactor to use the <code class="docutils literal notranslate"><span class="pre">qvtkWidget</span></code>.</div>
|
||
</div>
|
||
<p>The <code class="docutils literal notranslate"><span class="pre">update()</span></code> method of the <code class="docutils literal notranslate"><span class="pre">qvtkWidget</span></code> should be called each time you modify the PCL visualizer; if you don’t call it you don’t know if the
|
||
visualizer will be updated before the user try to pan/spin/zoom.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="c1">// Connect "random" button and the function</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">pushButton_random</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">clicked</span> <span class="p">()),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">randomButtonPressed</span> <span class="p">()));</span>
|
||
|
||
<span class="c1">// Connect R,G,B sliders and their functions</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_R</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">valueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">redSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)));</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_G</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">valueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">greenSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)));</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_B</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">valueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">blueSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)));</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_R</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">sliderReleased</span> <span class="p">()),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">RGBsliderReleased</span> <span class="p">()));</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_G</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">sliderReleased</span> <span class="p">()),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">RGBsliderReleased</span> <span class="p">()));</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_B</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">sliderReleased</span> <span class="p">()),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">RGBsliderReleased</span> <span class="p">()));</span>
|
||
|
||
<span class="c1">// Connect point size slider</span>
|
||
<span class="n">connect</span> <span class="p">(</span><span class="n">ui</span><span class="o">-></span><span class="n">horizontalSlider_p</span><span class="p">,</span> <span class="n">SIGNAL</span> <span class="p">(</span><span class="n">valueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)),</span> <span class="k">this</span><span class="p">,</span> <span class="n">SLOT</span> <span class="p">(</span><span class="n">pSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span><span class="p">)));</span>
|
||
</pre></div>
|
||
</div>
|
||
<dl class="docutils">
|
||
<dt>Here we connect slots and signals, this links UI actions to functions. Here is a summary of what we have linked :</dt>
|
||
<dd><ul class="first last">
|
||
<li><dl class="first docutils">
|
||
<dt><code class="docutils literal notranslate"><span class="pre">pushButton_random</span></code>:</dt>
|
||
<dd><div class="first last line-block">
|
||
<div class="line">if button is pressed call <code class="docutils literal notranslate"><span class="pre">randomButtonPressed</span> <span class="pre">()</span></code></div>
|
||
</div>
|
||
</dd>
|
||
</dl>
|
||
</li>
|
||
<li><dl class="first docutils">
|
||
<dt><code class="docutils literal notranslate"><span class="pre">horizontalSlider_R</span></code>:</dt>
|
||
<dd><div class="first last line-block">
|
||
<div class="line">if slider value is changed call <code class="docutils literal notranslate"><span class="pre">redSliderValueChanged(int)</span></code> with the new value as argument</div>
|
||
<div class="line">if slider is released call <code class="docutils literal notranslate"><span class="pre">RGBsliderReleased()</span></code></div>
|
||
</div>
|
||
</dd>
|
||
</dl>
|
||
</li>
|
||
<li><dl class="first docutils">
|
||
<dt><code class="docutils literal notranslate"><span class="pre">horizontalSlider_G</span></code>:</dt>
|
||
<dd><div class="first last line-block">
|
||
<div class="line">if slider value is changed call <code class="docutils literal notranslate"><span class="pre">redSliderValueChanged(int)</span></code> with the new value as argument</div>
|
||
<div class="line">if slider is released call <code class="docutils literal notranslate"><span class="pre">RGBsliderReleased()</span></code></div>
|
||
</div>
|
||
</dd>
|
||
</dl>
|
||
</li>
|
||
<li><dl class="first docutils">
|
||
<dt><code class="docutils literal notranslate"><span class="pre">horizontalSlider_B</span></code>:</dt>
|
||
<dd><div class="first last line-block">
|
||
<div class="line">if slider value is changed call <code class="docutils literal notranslate"><span class="pre">redSliderValueChanged(int)</span></code> with the new value as argument</div>
|
||
<div class="line">if slider is released call <code class="docutils literal notranslate"><span class="pre">RGBsliderReleased()</span></code></div>
|
||
</div>
|
||
</dd>
|
||
</dl>
|
||
</li>
|
||
</ul>
|
||
</dd>
|
||
</dl>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span> <span class="n">viewer</span><span class="o">-></span><span class="n">addPointCloud</span> <span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="s">"cloud"</span><span class="p">);</span>
|
||
<span class="n">pSliderValueChanged</span> <span class="p">(</span><span class="mi">2</span><span class="p">);</span>
|
||
<span class="n">viewer</span><span class="o">-></span><span class="n">resetCamera</span> <span class="p">();</span>
|
||
<span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">update</span> <span class="p">();</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">This is the last part of our constructor; we add the point cloud to the visualizer, call the method <code class="docutils literal notranslate"><span class="pre">pSliderValueChanged</span></code> to change the point size to 2.</div>
|
||
</div>
|
||
<p>We finally reset the camera within the PCL Visualizer not avoid the user having to zoom out and update the qvtkwidget to be
|
||
sure the modifications will be displayed.</p>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span>
|
||
<span class="n">PCLViewer</span><span class="o">::</span><span class="n">randomButtonPressed</span> <span class="p">()</span>
|
||
<span class="p">{</span>
|
||
<span class="n">printf</span> <span class="p">(</span><span class="s">"Random button was pressed</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
|
||
|
||
<span class="c1">// Set the new color</span>
|
||
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">point</span><span class="p">:</span> <span class="o">*</span><span class="n">cloud</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">r</span> <span class="o">=</span> <span class="mi">255</span> <span class="o">*</span><span class="p">(</span><span class="mi">1024</span> <span class="o">*</span> <span class="n">rand</span> <span class="p">()</span> <span class="o">/</span> <span class="p">(</span><span class="n">RAND_MAX</span> <span class="o">+</span> <span class="mf">1.0f</span><span class="p">));</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">g</span> <span class="o">=</span> <span class="mi">255</span> <span class="o">*</span><span class="p">(</span><span class="mi">1024</span> <span class="o">*</span> <span class="n">rand</span> <span class="p">()</span> <span class="o">/</span> <span class="p">(</span><span class="n">RAND_MAX</span> <span class="o">+</span> <span class="mf">1.0f</span><span class="p">));</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">b</span> <span class="o">=</span> <span class="mi">255</span> <span class="o">*</span><span class="p">(</span><span class="mi">1024</span> <span class="o">*</span> <span class="n">rand</span> <span class="p">()</span> <span class="o">/</span> <span class="p">(</span><span class="n">RAND_MAX</span> <span class="o">+</span> <span class="mf">1.0f</span><span class="p">));</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="n">viewer</span><span class="o">-></span><span class="n">updatePointCloud</span> <span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="s">"cloud"</span><span class="p">);</span>
|
||
<span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">update</span> <span class="p">();</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">This is the public slot function member called when the push button “Random” is pressed.</div>
|
||
<div class="line">The <code class="docutils literal notranslate"><span class="pre">for</span></code> loop iterates through the point cloud and changes point cloud color to a random number (between 0 and 255).</div>
|
||
<div class="line">The point cloud is then updated and so the <code class="docutils literal notranslate"><span class="pre">qtvtkwidget</span></code> is.</div>
|
||
</div>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span>
|
||
<span class="n">PCLViewer</span><span class="o">::</span><span class="n">RGBsliderReleased</span> <span class="p">()</span>
|
||
<span class="p">{</span>
|
||
<span class="c1">// Set the new color</span>
|
||
<span class="k">for</span> <span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="nl">point</span><span class="p">:</span> <span class="o">*</span><span class="n">cloud</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">r</span> <span class="o">=</span> <span class="n">red</span><span class="p">;</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">g</span> <span class="o">=</span> <span class="n">green</span><span class="p">;</span>
|
||
<span class="n">point</span><span class="p">.</span><span class="n">b</span> <span class="o">=</span> <span class="n">blue</span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
<span class="n">viewer</span><span class="o">-></span><span class="n">updatePointCloud</span> <span class="p">(</span><span class="n">cloud</span><span class="p">,</span> <span class="s">"cloud"</span><span class="p">);</span>
|
||
<span class="n">ui</span><span class="o">-></span><span class="n">qvtkWidget</span><span class="o">-></span><span class="n">update</span> <span class="p">();</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">This is the public slot function member called whenever the red, green or blue slider is released</div>
|
||
<div class="line">The <code class="docutils literal notranslate"><span class="pre">for</span></code> loop iterates through the point cloud and changes point cloud color to <code class="docutils literal notranslate"><span class="pre">red</span></code>, <code class="docutils literal notranslate"><span class="pre">green</span></code> and <code class="docutils literal notranslate"><span class="pre">blue</span></code> member values.</div>
|
||
<div class="line">The point cloud is then updated and so the <code class="docutils literal notranslate"><span class="pre">qtvtkwidget</span></code> is.</div>
|
||
</div>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="kt">void</span>
|
||
<span class="n">PCLViewer</span><span class="o">::</span><span class="n">redSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">red</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
|
||
<span class="n">printf</span> <span class="p">(</span><span class="s">"redSliderValueChanged: [%d|%d|%d]</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">red</span><span class="p">,</span> <span class="n">green</span><span class="p">,</span> <span class="n">blue</span><span class="p">);</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="n">PCLViewer</span><span class="o">::</span><span class="n">greenSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">green</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
|
||
<span class="n">printf</span> <span class="p">(</span><span class="s">"greenSliderValueChanged: [%d|%d|%d]</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">red</span><span class="p">,</span> <span class="n">green</span><span class="p">,</span> <span class="n">blue</span><span class="p">);</span>
|
||
<span class="p">}</span>
|
||
|
||
<span class="kt">void</span>
|
||
<span class="n">PCLViewer</span><span class="o">::</span><span class="n">blueSliderValueChanged</span> <span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">)</span>
|
||
<span class="p">{</span>
|
||
<span class="n">blue</span> <span class="o">=</span> <span class="n">value</span><span class="p">;</span>
|
||
<span class="n">printf</span><span class="p">(</span><span class="s">"blueSliderValueChanged: [%d|%d|%d]</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">red</span><span class="p">,</span> <span class="n">green</span><span class="p">,</span> <span class="n">blue</span><span class="p">);</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<div class="line-block">
|
||
<div class="line">These are the public slot function member called whenever the red, green or blue slider value is changed</div>
|
||
<div class="line">These functions just changes the member value accordingly to the slider value.</div>
|
||
<div class="line">Here the point cloud is not updated; so until you release the slider you won’t see any change in the visualizer.</div>
|
||
</div>
|
||
<div class="highlight-cpp notranslate"><div class="highlight"><pre><span></span><span class="n">PCLViewer</span><span class="o">::~</span><span class="n">PCLViewer</span> <span class="p">()</span>
|
||
<span class="p">{</span>
|
||
<span class="k">delete</span> <span class="n">ui</span><span class="p">;</span>
|
||
<span class="p">}</span>
|
||
</pre></div>
|
||
</div>
|
||
<p>The destructor.</p>
|
||
</div>
|
||
</div>
|
||
<div class="section" id="compiling-and-running">
|
||
<h2><a class="toc-backref" href="#id9">Compiling and running</a></h2>
|
||
<dl class="docutils">
|
||
<dt>There are two options here :</dt>
|
||
<dd><ul class="first last simple">
|
||
<li>You have configured the Qt project and you can compile/run just by clicking on the bottom left “Play” button.</li>
|
||
<li>You didn’t configure the Qt project; just go to the build folder an run <code class="docutils literal notranslate"><span class="pre">cmake</span> <span class="pre">../src</span> <span class="pre">&&</span> <span class="pre">make</span> <span class="pre">-j2</span> <span class="pre">&&</span> <span class="pre">./pcl_visualizer</span></code></li>
|
||
</ul>
|
||
</dd>
|
||
</dl>
|
||
<div class="line-block">
|
||
<div class="line">Notice that when changing the slider color, the cloud is not updated until you release the slider (<code class="docutils literal notranslate"><span class="pre">sliderReleased</span> <span class="pre">()</span></code> slot).</div>
|
||
</div>
|
||
<p>If you wanted to update the point cloud when the slider value is changed you could just call the <code class="docutils literal notranslate"><span class="pre">RGBsliderReleased</span> <span class="pre">()</span></code> function inside the
|
||
<code class="docutils literal notranslate"><span class="pre">*sliderValueChanged</span> <span class="pre">(int)</span></code> functions. The connect between <code class="docutils literal notranslate"><span class="pre">sliderReleased</span> <span class="pre">()</span></code> / <code class="docutils literal notranslate"><span class="pre">RGBsliderReleased</span> <span class="pre">()</span></code> would become useless then.</p>
|
||
<div class="line-block">
|
||
<div class="line">When using the slider for the point size; the size of the point is updated without having to release the slider.</div>
|
||
</div>
|
||
<a class="reference internal image-reference" href="_images/pcl_visualizer.gif"><img alt="_images/pcl_visualizer.gif" src="_images/pcl_visualizer.gif" style="height: 527px;" /></a>
|
||
</div>
|
||
<div class="section" id="more-on-qt-and-pcl">
|
||
<h2><a class="toc-backref" href="#id10">More on Qt and PCL</a></h2>
|
||
<p>If you want to know more about Qt and PCL go take a look at <a class="reference external" href="https://github.com/PointCloudLibrary/pcl/tree/master/apps">PCL apps</a> like
|
||
<a class="reference external" href="https://github.com/PointCloudLibrary/pcl/tree/master/apps/src/pcd_video_player">PCD video player</a>
|
||
or <a class="reference external" href="https://github.com/PointCloudLibrary/pcl/tree/master/apps/src/manual_registration">manual registration</a>.</p>
|
||
<p>Re-use the <a class="reference download internal" download="" href="_downloads/55e851d63713dc84e5e45f995b79499a/CMakeLists.txt"><code class="xref download docutils literal notranslate"><span class="pre">CMakeLists.txt</span></code></a> from this tutorial if you want to compile the application outside of PCL.</p>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
</div>
|
||
|
||
</div>
|
||
<footer>
|
||
|
||
|
||
<hr/>
|
||
|
||
<div role="contentinfo">
|
||
<p>
|
||
© 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> |