Program Listing for File dictionary.h

Return to documentation for file (include/aruco/dictionary.h)

#ifndef ARUCO_DICTIONARY_
#define ARUCO_DICTIONARY_

#include "aruco_export.h"

#include <opencv2/core/core.hpp>

#include <iostream>
#include <map>
#include <stdint.h>
#include <string>
#include <vector>

namespace aruco
{
class MarkerMap;
class ARUCO_EXPORT Dictionary
{
public:
  // loads from a set of predefined ones
  enum DICT_TYPES : uint64_t
  {
    ALL_DICTS = 0,
    ARUCO_MIP_36h12 = 1,  //*** recommended
    ARUCO = 2,            // original aruco dictionary. By default
    ARUCO_MIP_25h7 = 3,
    ARUCO_MIP_16h3 = 4,
    ARTAG = 5,  //
    ARTOOLKITPLUS = 6,
    ARTOOLKITPLUSBCH = 7,  //
    TAG16h5 = 8,
    TAG25h7 = 9,
    TAG25h9 = 10,
    TAG36h11 = 11,
    TAG36h10 = 12,   // april tags
    CHILITAGS = 13,  // chili tags dictionary . NOT RECOMMENDED. It has distance 0.
                     // Markers 806 and 682 should not be used!!!
    CUSTOM = 14,  // for used defined dictionaries  (using loadFromfile).
  };
  // indicates if a code is in the dictionary
  bool is(uint64_t code) const
  {
    return _code_id.find(code) != _code_id.end();
  }

  DICT_TYPES getType() const
  {
    return _type;
  }

  // reutnr the numerber of ids
  uint64_t size() const
  {
    return _code_id.size();
  }
  // returns the total number of bits of the binary code
  uint32_t nbits() const
  {
    return _nbits;
  }
  // returns the dictionary distance
  uint32_t tau() const
  {
    return _tau;
  }
  // returns the name
  std::string getName() const
  {
    return _name;
  }
  // return the set of ids
  const std::map<uint64_t, uint16_t>& getMapCode() const
  {
    return _code_id;
  }

  // returns the id of a given code.
  int operator[](uint64_t code)
  {
    return _code_id[code];
  }  // returns the id of a given code.
  int at(uint64_t code)
  {
    return _code_id[code];
  }

  // returns the image of the marker indicated by its id. It the id is not, returns empty
  // matrix
  //@param id of the marker image to return
  //@param bit_size of the image will be  AxA, A=(nbits()+2)*bit_size
  //@param enclosed_corners if true, extra rectagles are added touching the marker
  //corners. it can be used to allow subpixel refinement
  cv::Mat getMarkerImage_id(int id, int bit_size, bool addWaterMark = true,
                            bool enclosed_corners = false,
                            bool printExternalWhiteBorder = false, bool centralCircle = false);

  //   cv::Mat getMarkerMatrix_id(int id);

  // used for boards
  MarkerMap createMarkerMap(cv::Size gridSize, int MarkerSize, int MarkerDistance,
                            const std::vector<int>& Ids, bool chess_board = false);

  static Dictionary loadPredefined(DICT_TYPES type);
  static Dictionary loadPredefined(std::string type);

  static Dictionary loadFromFile(std::string path);

  static Dictionary load(std::string info);

  //    //io functions
  //    void saveToFile(std::string file);
  //    void readFromFile(std::string file);
  //    void saveToStream(std::ostream & str);
  //    void readFromStream(std::istream &str);

  // returns the dictionary distance
  static uint64_t computeDictionaryDistance(const Dictionary& d);

  // given a string,returns the type
  static DICT_TYPES getTypeFromString(std::string str);
  static std::string getTypeString(DICT_TYPES t);
  static bool isPredefinedDictinaryString(std::string str);
  static std::vector<std::string> getDicTypes();

private:
  // obfuscate start

  void insert(uint64_t code, int id)
  {
    _code_id.insert(std::make_pair(code, id));
  }
  static void fromVector(const std::vector<uint64_t>& codes,
                         std::map<uint64_t, uint16_t>& code_id_map);

  std::map<uint64_t, uint16_t> _code_id;  // marker have and code (internal binary code),
                                          // which correspond to an id.

  uint32_t _nbits;  // total number of bits . So, there are sqrt(nbits) in each axis
  uint32_t _tau;    // minimum distance between elements

  DICT_TYPES _type;
  std::string _name;
  // obfuscate end
};
}  // namespace aruco

#endif