thirdParty/PCL 1.12.0/include/pcl-1.12/pcl/registration/pyramid_feature_matching.h

218 lines
8.1 KiB
C
Raw Normal View History

/*
* Software License Agreement (BSD License)
*
* Copyright (c) 2011, Alexandru-Eugen Ichim
* Willow Garage, Inc
* Copyright (c) 2012-, 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.
*
* $Id$
*
*/
#pragma once
#include <pcl/pcl_base.h>
#include <pcl/point_representation.h>
namespace pcl {
/**
* \brief Class that compares two sets of features by using a multiscale representation
* of the features inside a pyramid. Each level of the pyramid offers information about
* the similarity of the two feature sets. \note Works with any Point/Feature type which
* has a PointRepresentation implementation \note The only parameters it needs are the
* input dimension ranges and the output dimension ranges. The input dimension ranges
* represent the ranges in which each dimension of the feature vector lies. As described
* in the paper, a minimum inter-vector distance of sqrt(nr_dims)/2 is needed. As such,
* the target dimension range parameter is used in order to augment/reduce the range for
* each dimension in order to obtain the necessary minimal inter-vector distance and to
* add/subtract weight to/from certain dimensions of the feature vector.
*
* Follows the algorithm presented in the publication:
* Grauman, K. & Darrell, T.
* The Pyramid Match Kernel: Discriminative Classification with Sets of Image
* Features Tenth IEEE International Conference on Computer Vision ICCV05 Volume 1
* October 2005
*
* \author Alexandru-Eugen Ichim
*/
template <typename PointFeature>
class PyramidFeatureHistogram : public PCLBase<PointFeature> {
public:
using PCLBase<PointFeature>::input_;
using Ptr = shared_ptr<PyramidFeatureHistogram<PointFeature>>;
using ConstPtr = shared_ptr<const PyramidFeatureHistogram<PointFeature>>;
using PyramidFeatureHistogramPtr = Ptr;
using FeatureRepresentationConstPtr =
shared_ptr<const pcl::PointRepresentation<PointFeature>>;
/** \brief Empty constructor that instantiates the feature representation variable */
PyramidFeatureHistogram();
/** \brief Method for setting the input dimension range parameter.
* \note Please check the PyramidHistogram class description for more details about
* this parameter.
*/
inline void
setInputDimensionRange(std::vector<std::pair<float, float>>& dimension_range_input)
{
dimension_range_input_ = dimension_range_input;
}
/** \brief Method for retrieving the input dimension range vector */
inline std::vector<std::pair<float, float>>
getInputDimensionRange()
{
return dimension_range_input_;
}
/** \brief Method to set the target dimension range parameter.
* \note Please check the PyramidHistogram class description for more details about
* this parameter.
*/
inline void
setTargetDimensionRange(std::vector<std::pair<float, float>>& dimension_range_target)
{
dimension_range_target_ = dimension_range_target;
}
/** \brief Method for retrieving the target dimension range vector */
inline std::vector<std::pair<float, float>>
getTargetDimensionRange()
{
return dimension_range_target_;
}
/** \brief Provide a pointer to the feature representation to use to convert features
* to k-D vectors. \param feature_representation the const boost shared pointer to a
* PointRepresentation
*/
inline void
setPointRepresentation(const FeatureRepresentationConstPtr& feature_representation)
{
feature_representation_ = feature_representation;
}
/** \brief Get a pointer to the feature representation used when converting features
* into k-D vectors. */
inline FeatureRepresentationConstPtr const
getPointRepresentation()
{
return feature_representation_;
}
/** \brief The central method for inserting the feature set inside the pyramid and
* obtaining the complete pyramid */
void
compute();
/** \brief Checks whether the pyramid histogram has been computed */
inline bool
isComputed()
{
return is_computed_;
}
/** \brief Static method for comparing two pyramid histograms that returns a floating
* point value between 0 and 1, representing the similarity between the feature sets
* on which the two pyramid histograms are based. \param pyramid_a Pointer to the
* first pyramid to be compared (needs to be computed already). \param pyramid_b
* Pointer to the second pyramid to be compared (needs to be computed already).
*/
static float
comparePyramidFeatureHistograms(const PyramidFeatureHistogramPtr& pyramid_a,
const PyramidFeatureHistogramPtr& pyramid_b);
private:
std::size_t nr_dimensions, nr_levels, nr_features;
std::vector<std::pair<float, float>> dimension_range_input_, dimension_range_target_;
FeatureRepresentationConstPtr feature_representation_;
bool is_computed_;
/** \brief Checks for input inconsistencies and initializes the underlying data
* structures */
bool
initializeHistogram();
/** \brief Converts a feature in templated form to an STL vector. This is the point
* where the conversion from the input dimension range to the target dimension range
* is done.
*/
void
convertFeatureToVector(const PointFeature& feature,
std::vector<float>& feature_vector);
/** \brief Adds a feature vector to its corresponding bin at each level in the pyramid
*/
void
addFeature(std::vector<float>& feature);
/** \brief Access the pyramid bin given the position of the bin at the given pyramid
* level and the pyramid level \param access index of the bin at the respective level
* \param level the level in the pyramid
*/
inline unsigned int&
at(std::vector<std::size_t>& access, std::size_t& level);
/** \brief Access the pyramid bin given a feature vector and the pyramid level
* \param feature the feature in vectorized form
* \param level the level in the pyramid
*/
inline unsigned int&
at(std::vector<float>& feature, std::size_t& level);
/** \brief Structure for representing a single pyramid histogram level */
struct PyramidFeatureHistogramLevel {
PyramidFeatureHistogramLevel() {}
PyramidFeatureHistogramLevel(std::vector<std::size_t>& a_bins_per_dimension,
std::vector<float>& a_bin_step)
: bins_per_dimension(a_bins_per_dimension), bin_step(a_bin_step)
{
initializeHistogramLevel();
}
void
initializeHistogramLevel();
std::vector<unsigned int> hist;
std::vector<std::size_t> bins_per_dimension;
std::vector<float> bin_step;
};
std::vector<PyramidFeatureHistogramLevel> hist_levels;
};
} // namespace pcl
#ifdef PCL_NO_PRECOMPILE
#include <pcl/registration/impl/pyramid_feature_matching.hpp>
#endif