Program Listing for File TagDetector.h

Return to documentation for file (include/apriltag_mit/AprilTags/TagDetector.h)

#ifndef APRILTAGS_TAGDETECTOR_H_
#define APRILTAGS_TAGDETECTOR_H_

#include <unordered_map>
#include <opencv2/core/core.hpp>

#include "apriltag_mit/AprilTags/TagDetection.h"
#include "apriltag_mit/AprilTags/TagFamily.h"
#include "apriltag_mit/AprilTags/FloatImage.h"
#include "apriltag_mit/AprilTags/Quad.h"
#include "apriltag_mit/AprilTags/GrayModel.h"
#include "apriltag_mit/AprilTags/DisjointSets.h"

namespace AprilTags {

class TagDetector {
 public:
  using Clusters = std::unordered_map<int, std::vector<cv::Point3f>>;

  explicit TagDetector(const TagCodes& tag_codes, int black_border = 1);

  std::vector<TagDetection> ExtractTags(const cv::Mat& image) const;

  void set_black_border(int black_border);
  int black_border() const;

 private:
  const TagFamily tag_family_;

  int CalcFilterSize(float sigma) const;

  void Preprocess(const FloatImage& image, FloatImage& im_decode,
                  FloatImage& im_segment) const;

  void CalcPolar(const FloatImage& image, FloatImage& im_mag,
                 FloatImage& im_theta) const;

  DisjointSets ExtractEdges(const FloatImage& im_mag,
                            const FloatImage& im_theta) const;

  Clusters ClusterPixels(DisjointSets& uf, const FloatImage& im_mag) const;

  std::vector<Segment> FitLines(const Clusters& clusters,
                                const FloatImage& im_mag,
                                const FloatImage& im_theta) const;

  void ChainSegments(std::vector<Segment>& segments,
                     const FloatImage& image) const;

  std::vector<Quad> SearchQuads(std::vector<Segment>& segments) const;

  std::vector<TagDetection> DecodeQuads(const std::vector<Quad>& quads,
                                        const FloatImage& image) const;

  std::vector<TagDetection> ResolveOverlap(
      const std::vector<TagDetection>& detections) const;

  unsigned black_border_ = 1;

  float decode_sigma_ = 0.8;

  float segment_sigma_ = 0.8;
};

void ConvertToGray(cv::InputArray in, cv::OutputArray out);

std::vector<int> IndexFromNonZero(const cv::Mat mat);

}  // namespace AprilTags

#endif  // APRILTAGS_TAGDETECTOR_H_