IsometricPatternMatcher/IsometricPattern.h (73 lines of code) (raw):

// Copyright (c) Facebook, Inc. and its affiliates. // // This source code is licensed under the MIT license found in the // LICENSE file in the root directory of this source tree. #pragma once #include <fmt/core.h> #include <Eigen/Core> #include <Eigen/Geometry> #include <array> #include <cstdint> #include <vector> #define ISOMETRIC_PATTERN_TRAILING_STRING "<!-- SURREAL GRID" // more about the isometric calibration pattern can be found: // https://docs.google.com/document/d/1lZc0-caCUlBOB10AWK4wunqBcsZU7zduUHcn8L5dBaw/edit namespace surreal_opensource { class IsometricGridDot { public: static const size_t kNumNeighbours = 6; IsometricGridDot() {} IsometricGridDot(double verticalSpacing, double horizontalSpacing, double dotRadius, size_t numberLayer, const Eigen::Vector2i& gridRowsCols, uint32_t seed); IsometricGridDot(const std::string& gridFile); Eigen::MatrixXi makeIsometricPattern(uint32_t seed); // rotate entire isometric pattern Eigen::MatrixXi Rotate60Right(Eigen::MatrixXi& inputPatternGrid) const; // rotate only one dot in isometric pattern static Eigen::Vector3i rotateRight60ForDot(const Eigen::Vector3i& coord); static Eigen::Vector3i rotateLeft60ForDot(const Eigen::Vector3i& coord); std::array<Eigen::MatrixXi, 6> makeIsometricPatternGroup( Eigen::MatrixXi pattern0); void LoadFromSVG(const std::string& SVGFile); bool IsXmlParamsString(std::string s); bool ParseXmlParamsString(const std::string& s, std::string& binaryPattern, size_t& numberLayer, Eigen::Vector2i& gridRowsCols, double& horizontalSpacing, double& verticalSpacing, double& dotRadius); template <typename T> bool ParseOption(const std::string& s, const std::string& key, T& val); // save svg for isometric pattern with code 1 dots(white) and code 0 // dots(gray) void SaveSVG(const std::string& filename, const std::string& color0 = "gray", const std::string& color1 = "white", const std::string& bgcolor = "black", int PGindex = 0) const; // Due to non-uniformity, we also save two-shot svgs for isometric pattern: // svgForCode1: code 1 dots(white) and svgForCode0: code 0 dots(white) void SaveSVGPairs(const std::string& svgForCode1, const std::string& svgForCode0, const std::string& dotcolor = "white", const std::string& bgcolor = "black", int PGindex = 0) const; void Clear(); // bool Match(std::map<Eigen::Vector2i, Vertex*>& obs) const; const Eigen::AlignedBoxXd GetPatternBounds() const { throw std::runtime_error("Not Implemented"); } /** * Gets the set of 3D points for this pattern. * * @return The location of the calibu points as a [3 x (col * row)] matrix. * All points are projected to the z=0 plane. */ const Eigen::MatrixXd& GetPattern() const { return patternPts_; } /** * Gets the binary code. * * @return Vector of binary codes (1 or 0), entries are aligned with the * points returned in the GetPattern() function. */ const std::vector<int64_t>& GetPatternCodes() const { return patternPtsCodes_; } inline size_t NumberLayer() const { return numberLayer_; } inline size_t gridRows() const { return gridRowsCols_[0]; } inline size_t gridCols() const { return gridRowsCols_[1]; } inline double verticalSpacing() const { return verticalSpacing_; } inline double horizontalSpacing() const { return horizontalSpacing_; } inline double dotRadius() const { return dotRadius_; } inline size_t storageMapRows() const { return storageMapRows_; } const Eigen::MatrixXi& GetBinaryPattern(unsigned int idx = 0) const { return patternGroup_[idx]; } const std::array<Eigen::MatrixXi, 6>& GetBinaryPatternGroup(void) const { return patternGroup_; } protected: void Init(); Eigen::MatrixXd patternPts_; // 3XN std::vector<int64_t> patternPtsCodes_; double verticalSpacing_; double horizontalSpacing_; std::array<Eigen::MatrixXi, 6> patternGroup_; // 2X2 storage map double dotRadius_; size_t numberLayer_; Eigen::Vector2i gridRowsCols_; size_t storageMapRows_; }; } // namespace surreal_opensource