/* * 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 #include #include 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; using ConstPtr = shared_ptr; /** \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 bool addFeatureHistogram (const pcl::PointCloud &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 bool addFeatureHistogram (const pcl::PointCloud &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 bool updateFeatureHistogram (const pcl::PointCloud &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 bool updateFeatureHistogram (const pcl::PointCloud &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 &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 &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 exit_main_loop_timer_callback_; vtkSmartPointer exit_callback_; /** \brief Set to true when the histogram visualizer is ready to be terminated. */ bool stopped_; }; } } #include