Program Listing for File SearchTreeFlann.hpp

Return to documentation for file (include/lvr2/reconstruction/SearchTreeFlann.hpp)

/*
 * SearchTreeFlann.hpp
 *
 *  Created on: Sep 22, 2015
 *      Author: Thomas Wiemann
 */

#ifndef LVR2_RECONSTRUCTION_SEARCHTREEFLANN_HPP_
#define LVR2_RECONSTRUCTION_SEARCHTREEFLANN_HPP_

#include <vector>
#include <memory>

// Required here since OpenCV leaks the USE_UNORDERED_MAP
// resulting in compiler errors from flann
#undef USE_UNORDERED_MAP
#include <flann/flann.hpp>

#include "lvr2/util/Timestamp.hpp"
#include "lvr2/types/PointBuffer.hpp"
#include "lvr2/reconstruction/SearchTree.hpp"

using std::vector;
using std::unique_ptr;

namespace lvr2
{

template<typename BaseVecT>
class SearchTreeFlann : public SearchTree<BaseVecT>
{
private:
    using CoordT = typename BaseVecT::CoordType;

public:

    SearchTreeFlann(PointBufferPtr buffer);

    virtual int kSearch(
        const BaseVecT& qp,
        int k,
        vector<size_t>& indices,
        vector<CoordT>& distances
    ) const override;

    virtual int radiusSearch(
        const BaseVecT& qp,
        int k,
        float r,
        vector<size_t>& indices,
        vector<CoordT>& distances
    ) const override;

    void kSearchMany(
        const BaseVecT* query,
        int n,
        int k,
        size_t* indices,
        CoordT* distances
    ) const;

protected:

    unique_ptr<flann::Index<flann::L2_Simple<CoordT>>> m_tree;

    boost::shared_array<CoordT> m_data;
};

template <typename BaseVecT>
using SearchTreeFlannPtr = std::shared_ptr<SearchTreeFlann<BaseVecT>>;

} // namespace lvr2

#include "lvr2/reconstruction/SearchTreeFlann.tcc"

#endif /* LVR2_RECONSTRUCTION_SEARCHTREEFLANN_HPP_ */