/** * File: BRIEF.h * Author: Dorian Galvez-Lopez * Date: March 2011 * Description: implementation of BRIEF (Binary Robust Independent * Elementary Features) descriptor by * Michael Calonder, Vincent Lepetit and Pascal Fua * + close binary tests (by Dorian Galvez-Lopez) * * If you use this code with the RANDOM_CLOSE descriptor version, please cite: @INPROCEEDINGS{GalvezIROS11, author={Galvez-Lopez, Dorian and Tardos, Juan D.}, booktitle={Intelligent Robots and Systems (IROS), 2011 IEEE/RSJ International Conference on}, title={Real-time loop detection with bags of binary words}, year={2011}, month={sept.}, volume={}, number={}, pages={51 -58}, keywords={}, doi={10.1109/IROS.2011.6094885}, ISSN={2153-0858} } * * License: see the LICENSE.txt file * */ #ifndef __D_BRIEF__ #define __D_BRIEF__ #include #include #include namespace DVision { /// BRIEF descriptor class BRIEF { public: /// Bitset type typedef boost::dynamic_bitset<> bitset; /// Type of pairs enum Type { RANDOM, // random pairs (Calonder's original version) RANDOM_CLOSE, // random but close pairs (used in GalvezIROS11) }; public: /** * Creates the BRIEF a priori data for descriptors of nbits length * @param nbits descriptor length in bits * @param patch_size * @param type type of pairs to generate */ BRIEF(int nbits = 256, int patch_size = 48, Type type = RANDOM_CLOSE); virtual ~BRIEF(); /** * Returns the descriptor length in bits * @return descriptor length in bits */ inline int getDescriptorLengthInBits() const { return m_bit_length; } /** * Returns the type of classifier */ inline Type getType() const { return m_type; } /** * Returns the size of the patch */ inline int getPatchSize() const { return m_patch_size; } /** * Returns the BRIEF descriptors of the given keypoints in the given image * @param image * @param points * @param descriptors * @param treat_image (default: true) if true, the image is converted to * grayscale if needed and smoothed. If not, it is assumed the image has * been treated by the user * @note this function is similar to BRIEF::compute */ inline void operator() (const cv::Mat &image, const std::vector &points, std::vector &descriptors, bool treat_image = true) const { compute(image, points, descriptors, treat_image); } /** * Returns the BRIEF descriptors of the given keypoints in the given image * @param image * @param points * @param descriptors * @param treat_image (default: true) if true, the image is converted to * grayscale if needed and smoothed. If not, it is assumed the image has * been treated by the user * @note this function is similar to BRIEF::operator() */ void compute(const cv::Mat &image, const std::vector &points, std::vector &descriptors, bool treat_image = true) const; /** * Exports the test pattern * @param x1 x1 coordinates of pairs * @param y1 y1 coordinates of pairs * @param x2 x2 coordinates of pairs * @param y2 y2 coordinates of pairs */ inline void exportPairs(std::vector &x1, std::vector &y1, std::vector &x2, std::vector &y2) const { x1 = m_x1; y1 = m_y1; x2 = m_x2; y2 = m_y2; } /** * Sets the test pattern * @param x1 x1 coordinates of pairs * @param y1 y1 coordinates of pairs * @param x2 x2 coordinates of pairs * @param y2 y2 coordinates of pairs */ inline void importPairs(const std::vector &x1, const std::vector &y1, const std::vector &x2, const std::vector &y2) { m_x1 = x1; m_y1 = y1; m_x2 = x2; m_y2 = y2; m_bit_length = x1.size(); } /** * Returns the Hamming distance between two descriptors * @param a first descriptor vector * @param b second descriptor vector * @return hamming distance */ inline static int distance(const bitset &a, const bitset &b) { return (a^b).count(); } protected: /** * Generates random points in the patch coordinates, according to * m_patch_size and m_bit_length */ void generateTestPoints(); protected: /// Descriptor length in bits int m_bit_length; /// Patch size int m_patch_size; /// Type of pairs Type m_type; /// Coordinates of test points relative to the center of the patch std::vector m_x1, m_x2; std::vector m_y1, m_y2; }; } // namespace DVision #endif