255 lines
11 KiB
C
255 lines
11 KiB
C
|
|
/*
|
||
|
|
* Software License Agreement (BSD License)
|
||
|
|
*
|
||
|
|
* Point Cloud Library (PCL) - www.pointclouds.org
|
||
|
|
* Copyright (c) 2010-2011, Willow Garage, Inc.
|
||
|
|
*
|
||
|
|
* All rights reserved.
|
||
|
|
*
|
||
|
|
* Redistribution and use in source and binary forms, with or without
|
||
|
|
* modification, are permitted provided that the following conditions
|
||
|
|
* are met:
|
||
|
|
*
|
||
|
|
* * Redistributions of source code must retain the above copyright
|
||
|
|
* notice, this list of conditions and the following disclaimer.
|
||
|
|
* * Redistributions in binary form must reproduce the above
|
||
|
|
* copyright notice, this list of conditions and the following
|
||
|
|
* disclaimer in the documentation and/or other materials provided
|
||
|
|
* with the distribution.
|
||
|
|
* * Neither the name of Willow Garage, Inc. nor the names of its
|
||
|
|
* contributors may be used to endorse or promote products derived
|
||
|
|
* from this software without specific prior written permission.
|
||
|
|
*
|
||
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||
|
|
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||
|
|
* POSSIBILITY OF SUCH DAMAGE.
|
||
|
|
*
|
||
|
|
* $Id$
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <pcl/visualization/interactor_style.h>
|
||
|
|
#include <pcl/visualization/common/common.h>
|
||
|
|
#include <pcl/visualization/common/ren_win_interact_map.h>
|
||
|
|
|
||
|
|
class vtkRenderWindowInteractor;
|
||
|
|
|
||
|
|
namespace pcl
|
||
|
|
{
|
||
|
|
namespace visualization
|
||
|
|
{
|
||
|
|
/** \brief PCL histogram visualizer main class.
|
||
|
|
* \author Radu Bogdan Rusu
|
||
|
|
* \ingroup visualization
|
||
|
|
*/
|
||
|
|
class PCL_EXPORTS PCLHistogramVisualizer
|
||
|
|
{
|
||
|
|
public:
|
||
|
|
using Ptr = shared_ptr<PCLHistogramVisualizer>;
|
||
|
|
using ConstPtr = shared_ptr<const PCLHistogramVisualizer>;
|
||
|
|
|
||
|
|
/** \brief PCL histogram visualizer constructor. */
|
||
|
|
PCLHistogramVisualizer ();
|
||
|
|
|
||
|
|
virtual ~PCLHistogramVisualizer () {}
|
||
|
|
/** \brief Spin once method. Calls the interactor and updates the screen once.
|
||
|
|
* \param[in] time - How long (in ms) should the visualization loop be allowed to run.
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
spinOnce (int time = 1);
|
||
|
|
|
||
|
|
/** \brief Spin method. Calls the interactor and runs an internal loop. */
|
||
|
|
void
|
||
|
|
spin ();
|
||
|
|
|
||
|
|
/** \brief Set the viewport's background color.
|
||
|
|
* \param[in] r the red component of the RGB color
|
||
|
|
* \param[in] g the green component of the RGB color
|
||
|
|
* \param[in] b the blue component of the RGB color
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
setBackgroundColor (const double &r, const double &g, const double &b);
|
||
|
|
|
||
|
|
/** \brief Add a histogram feature to screen as a separate window, from a cloud containing a single histogram.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] hsize the length of the histogram
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
* \param[in] win_width the width of the window
|
||
|
|
* \param[in] win_height the height of the window
|
||
|
|
*/
|
||
|
|
template <typename PointT> bool
|
||
|
|
addFeatureHistogram (const pcl::PointCloud<PointT> &cloud,
|
||
|
|
int hsize,
|
||
|
|
const std::string &id = "cloud", int win_width = 640, int win_height = 200);
|
||
|
|
|
||
|
|
/** \brief Add a histogram feature to screen as a separate window from a cloud containing a single histogram.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] field_name the field name containing the histogram
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
* \param[in] win_width the width of the window
|
||
|
|
* \param[in] win_height the height of the window
|
||
|
|
*/
|
||
|
|
bool
|
||
|
|
addFeatureHistogram (const pcl::PCLPointCloud2 &cloud,
|
||
|
|
const std::string &field_name,
|
||
|
|
const std::string &id = "cloud", int win_width = 640, int win_height = 200);
|
||
|
|
|
||
|
|
/** \brief Add a histogram feature to screen as a separate window.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] field_name the field name containing the histogram
|
||
|
|
* \param[in] index the point index to extract the histogram from
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
* \param[in] win_width the width of the window
|
||
|
|
* \param[in] win_height the height of the window
|
||
|
|
*/
|
||
|
|
template <typename PointT> bool
|
||
|
|
addFeatureHistogram (const pcl::PointCloud<PointT> &cloud,
|
||
|
|
const std::string &field_name,
|
||
|
|
const pcl::index_t index,
|
||
|
|
const std::string &id = "cloud", int win_width = 640, int win_height = 200);
|
||
|
|
|
||
|
|
/** \brief Add a histogram feature to screen as a separate window.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] field_name the field name containing the histogram
|
||
|
|
* \param[in] index the point index to extract the histogram from
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
* \param[in] win_width the width of the window
|
||
|
|
* \param[in] win_height the height of the window
|
||
|
|
*/
|
||
|
|
bool
|
||
|
|
addFeatureHistogram (const pcl::PCLPointCloud2 &cloud,
|
||
|
|
const std::string &field_name,
|
||
|
|
const pcl::index_t index,
|
||
|
|
const std::string &id = "cloud", int win_width = 640, int win_height = 200);
|
||
|
|
|
||
|
|
/** \brief Update a histogram feature that is already on screen, with a cloud containing a single histogram.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] hsize the length of the histogram
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
*/
|
||
|
|
template <typename PointT> bool
|
||
|
|
updateFeatureHistogram (const pcl::PointCloud<PointT> &cloud, int hsize, const std::string &id = "cloud");
|
||
|
|
|
||
|
|
|
||
|
|
/** \brief Update a histogram feature that is already on screen, with a cloud containing a single histogram.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] field_name the field name containing the histogram
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
*/
|
||
|
|
bool
|
||
|
|
updateFeatureHistogram (const pcl::PCLPointCloud2 &cloud,
|
||
|
|
const std::string &field_name,
|
||
|
|
const std::string &id = "cloud");
|
||
|
|
|
||
|
|
|
||
|
|
/** \brief Update a histogram feature that is already on screen, with a cloud containing a single histogram.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] field_name the field name containing the histogram
|
||
|
|
* \param[in] index the point index to extract the histogram from
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
*/
|
||
|
|
template <typename PointT> bool
|
||
|
|
updateFeatureHistogram (const pcl::PointCloud<PointT> &cloud, const std::string &field_name,
|
||
|
|
const pcl::index_t index, const std::string &id = "cloud");
|
||
|
|
|
||
|
|
|
||
|
|
/** \brief Update a histogram feature that is already on screen, with a cloud containing a single histogram.
|
||
|
|
* \param[in] cloud the PointCloud dataset containing the histogram
|
||
|
|
* \param[in] field_name the field name containing the histogram
|
||
|
|
* \param[in] index the point index to extract the histogram from
|
||
|
|
* \param[in] id the point cloud object id (default: cloud)
|
||
|
|
*/
|
||
|
|
bool
|
||
|
|
updateFeatureHistogram (const pcl::PCLPointCloud2 &cloud,
|
||
|
|
const std::string &field_name, const pcl::index_t index,
|
||
|
|
const std::string &id = "cloud");
|
||
|
|
|
||
|
|
|
||
|
|
/** \brief Set the Y range to minp-maxp for all histograms.
|
||
|
|
* \param[in] minp the minimum Y range
|
||
|
|
* \param[in] maxp the maximum Y range
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
setGlobalYRange (float minp, float maxp);
|
||
|
|
|
||
|
|
/** \brief Update all window positions on screen so that they fit. */
|
||
|
|
void
|
||
|
|
updateWindowPositions ();
|
||
|
|
|
||
|
|
protected:
|
||
|
|
|
||
|
|
/** \brief Create a 2D actor from the given vtkDoubleArray histogram and add it to the screen.
|
||
|
|
* \param[in] xy_array the input vtkDoubleArray holding the histogram data
|
||
|
|
* \param[out] renwinint the resultant render window interactor holding the rendered object
|
||
|
|
* \param[in] id the point cloud object id
|
||
|
|
* \param[in] win_width the width of the window
|
||
|
|
* \param[in] win_height the height of the window
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
createActor (const vtkSmartPointer<vtkDoubleArray> &xy_array,
|
||
|
|
RenWinInteract &renwinint,
|
||
|
|
const std::string &id, const int win_width, const int win_height);
|
||
|
|
|
||
|
|
/** \brief Remove the current 2d actor and create a new 2D actor from the given vtkDoubleArray histogram and add it to the screen.
|
||
|
|
* \param[in] xy_array the input vtkDoubleArray holding the histogram data
|
||
|
|
* \param[out] renwinupd the resultant render window interactor holding the rendered object
|
||
|
|
* \param[in] hsize Histogram size
|
||
|
|
*/
|
||
|
|
void
|
||
|
|
reCreateActor (const vtkSmartPointer<vtkDoubleArray> &xy_array,
|
||
|
|
RenWinInteract* renwinupd, const int hsize);
|
||
|
|
|
||
|
|
private:
|
||
|
|
/** \brief A map of all windows on screen (with their renderers and interactors). */
|
||
|
|
RenWinInteractMap wins_;
|
||
|
|
|
||
|
|
struct ExitMainLoopTimerCallback : public vtkCommand
|
||
|
|
{
|
||
|
|
static ExitMainLoopTimerCallback* New ()
|
||
|
|
{
|
||
|
|
return (new ExitMainLoopTimerCallback);
|
||
|
|
}
|
||
|
|
void
|
||
|
|
Execute (vtkObject*, unsigned long event_id, void* call_data) override;
|
||
|
|
|
||
|
|
int right_timer_id;
|
||
|
|
vtkRenderWindowInteractor *interact;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct ExitCallback : public vtkCommand
|
||
|
|
{
|
||
|
|
ExitCallback () : his () {}
|
||
|
|
|
||
|
|
static ExitCallback* New ()
|
||
|
|
{
|
||
|
|
return (new ExitCallback);
|
||
|
|
}
|
||
|
|
|
||
|
|
void
|
||
|
|
Execute (vtkObject*, unsigned long event_id, void*) override;
|
||
|
|
|
||
|
|
PCLHistogramVisualizer *his;
|
||
|
|
};
|
||
|
|
|
||
|
|
/** \brief Callback object enabling us to leave the main loop, when a timer fires. */
|
||
|
|
vtkSmartPointer<ExitMainLoopTimerCallback> exit_main_loop_timer_callback_;
|
||
|
|
vtkSmartPointer<ExitCallback> exit_callback_;
|
||
|
|
/** \brief Set to true when the histogram visualizer is ready to be terminated. */
|
||
|
|
bool stopped_;
|
||
|
|
};
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
#include <pcl/visualization/impl/histogram_visualizer.hpp>
|