330 lines
10 KiB
C
Raw Normal View History

/*
* Software License Agreement (BSD License)
*
* Point Cloud Library (PCL) - www.pointclouds.org
* Copyright (c) 2013-, Open Perception, 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 the copyright holder(s) 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.
*
* person_cluster.h
* Created on: Nov 30, 2012
* Author: Matteo Munaro
*/
#pragma once
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
namespace pcl
{
namespace people
{
/** \brief @b PersonCluster represents a class for representing information about a cluster containing a person.
* \author Filippo Basso, Matteo Munaro
* \ingroup people
*/
template <typename PointT> class PersonCluster;
template <typename PointT> bool operator<(const PersonCluster<PointT>& c1, const PersonCluster<PointT>& c2);
template <typename PointT>
class PersonCluster
{
protected:
bool head_centroid_;
/** \brief Minimum x coordinate of the cluster points. */
float min_x_;
/** \brief Minimum y coordinate of the cluster points. */
float min_y_;
/** \brief Minimum z coordinate of the cluster points. */
float min_z_;
/** \brief Maximum x coordinate of the cluster points. */
float max_x_;
/** \brief Maximum y coordinate of the cluster points. */
float max_y_;
/** \brief Maximum z coordinate of the cluster points. */
float max_z_;
/** \brief Sum of x coordinates of the cluster points. */
float sum_x_;
/** \brief Sum of y coordinates of the cluster points. */
float sum_y_;
/** \brief Sum of z coordinates of the cluster points. */
float sum_z_;
/** \brief Number of cluster points. */
int n_;
/** \brief x coordinate of the cluster centroid. */
float c_x_;
/** \brief y coordinate of the cluster centroid. */
float c_y_;
/** \brief z coordinate of the cluster centroid. */
float c_z_;
/** \brief Cluster height from the ground plane. */
float height_;
/** \brief Cluster distance from the sensor. */
float distance_;
/** \brief Cluster centroid horizontal angle with respect to z axis. */
float angle_;
/** \brief Maximum angle of the cluster points. */
float angle_max_;
/** \brief Minimum angle of the cluster points. */
float angle_min_;
/** \brief Cluster top point. */
Eigen::Vector3f top_;
/** \brief Cluster bottom point. */
Eigen::Vector3f bottom_;
/** \brief Cluster centroid. */
Eigen::Vector3f center_;
/** \brief Theoretical cluster top. */
Eigen::Vector3f ttop_;
/** \brief Theoretical cluster bottom (lying on the ground plane). */
Eigen::Vector3f tbottom_;
/** \brief Theoretical cluster center (between ttop_ and tbottom_). */
Eigen::Vector3f tcenter_;
/** \brief Vector containing the minimum coordinates of the cluster. */
Eigen::Vector3f min_;
/** \brief Vector containing the maximum coordinates of the cluster. */
Eigen::Vector3f max_;
/** \brief Point cloud indices of the cluster points. */
pcl::PointIndices points_indices_;
/** \brief If true, the sensor is considered to be vertically placed (portrait mode). */
bool vertical_;
/** \brief PersonCluster HOG confidence. */
float person_confidence_;
public:
using PointCloud = pcl::PointCloud<PointT>;
using PointCloudPtr = typename PointCloud::Ptr;
using PointCloudConstPtr = typename PointCloud::ConstPtr;
/** \brief Constructor. */
PersonCluster (
const PointCloudPtr& input_cloud,
const pcl::PointIndices& indices,
const Eigen::VectorXf& ground_coeffs,
float sqrt_ground_coeffs,
bool head_centroid,
bool vertical = false);
/** \brief Destructor. */
virtual ~PersonCluster ();
/**
* \brief Returns the height of the cluster.
* \return the height of the cluster.
*/
float
getHeight () const;
/**
* \brief Update the height of the cluster.
* \param[in] ground_coeffs The coefficients of the ground plane.
* \return the height of the cluster.
*/
float
updateHeight (const Eigen::VectorXf& ground_coeffs);
/**
* \brief Update the height of the cluster.
* \param[in] ground_coeffs The coefficients of the ground plane.
* \param[in] sqrt_ground_coeffs The norm of the vector [a, b, c] where a, b and c are the first
* three coefficients of the ground plane (ax + by + cz + d = 0).
* \return the height of the cluster.
*/
float
updateHeight (const Eigen::VectorXf& ground_coeffs, float sqrt_ground_coeffs);
/**
* \brief Returns the distance of the cluster from the sensor.
* \return the distance of the cluster (its centroid) from the sensor without considering the
* y dimension.
*/
float
getDistance () const;
/**
* \brief Returns the angle formed by the cluster's centroid with respect to the sensor (in radians).
* \return the angle formed by the cluster's centroid with respect to the sensor (in radians).
*/
float
getAngle () const;
/**
* \brief Returns the minimum angle formed by the cluster with respect to the sensor (in radians).
* \return the minimum angle formed by the cluster with respect to the sensor (in radians).
*/
float
getAngleMin () const;
/**
* \brief Returns the maximum angle formed by the cluster with respect to the sensor (in radians).
* \return the maximum angle formed by the cluster with respect to the sensor (in radians).
*/
float
getAngleMax () const;
/**
* \brief Returns the indices of the point cloud points corresponding to the cluster.
* \return the indices of the point cloud points corresponding to the cluster.
*/
pcl::PointIndices&
getIndices ();
/**
* \brief Returns the theoretical top point.
* \return the theoretical top point.
*/
Eigen::Vector3f&
getTTop ();
/**
* \brief Returns the theoretical bottom point.
* \return the theoretical bottom point.
*/
Eigen::Vector3f&
getTBottom ();
/**
* \brief Returns the theoretical centroid (at half height).
* \return the theoretical centroid (at half height).
*/
Eigen::Vector3f&
getTCenter ();
/**
* \brief Returns the top point.
* \return the top point.
*/
Eigen::Vector3f&
getTop ();
/**
* \brief Returns the bottom point.
* \return the bottom point.
*/
Eigen::Vector3f&
getBottom ();
/**
* \brief Returns the centroid.
* \return the centroid.
*/
Eigen::Vector3f&
getCenter ();
//Eigen::Vector3f& getTMax();
/**
* \brief Returns the point formed by min x, min y and min z.
* \return the point formed by min x, min y and min z.
*/
Eigen::Vector3f&
getMin ();
/**
* \brief Returns the point formed by max x, max y and max z.
* \return the point formed by max x, max y and max z.
*/
Eigen::Vector3f&
getMax ();
/**
* \brief Returns the HOG confidence.
* \return the HOG confidence.
*/
float
getPersonConfidence () const;
/**
* \brief Returns the number of points of the cluster.
* \return the number of points of the cluster.
*/
int
getNumberPoints () const;
/**
* \brief Sets the cluster height.
* \param[in] height
*/
void
setHeight (float height);
/**
* \brief Sets the HOG confidence.
* \param[in] confidence
*/
void
setPersonConfidence (float confidence);
/**
* \brief Draws the theoretical 3D bounding box of the cluster in the PCL visualizer.
* \param[in] viewer PCL visualizer.
* \param[in] person_number progressive number representing the person.
*/
void
drawTBoundingBox (pcl::visualization::PCLVisualizer& viewer, int person_number);
/**
* \brief For sorting purpose: sort by distance.
*/
friend bool operator< <>(const PersonCluster<PointT>& c1, const PersonCluster<PointT>& c2);
protected:
/**
* \brief PersonCluster initialization.
*/
void init(
const PointCloudPtr& input_cloud,
const pcl::PointIndices& indices,
const Eigen::VectorXf& ground_coeffs,
float sqrt_ground_coeffs,
bool head_centroid,
bool vertical);
};
} /* namespace people */
} /* namespace pcl */
#include <pcl/people/impl/person_cluster.hpp>