Home | History | Annotate | Download | only in dynamic_depth
      1 #ifndef DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_DEPTH_MAP_H_  // NOLINT
      2 #define DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_DEPTH_MAP_H_  // NOLINT
      3 
      4 #include <memory>
      5 #include <string>
      6 #include <unordered_map>
      7 #include <utility>
      8 
      9 #include "dynamic_depth/element.h"
     10 #include "dynamic_depth/item.h"
     11 #include "xmpmeta/xml/deserializer.h"
     12 #include "xmpmeta/xml/serializer.h"
     13 
     14 namespace dynamic_depth {
     15 
     16 // The depth conversion format. Please see the Depth Map element in the
     17 // Dynamnic Depth specification for more details.
     18 enum class DepthFormat { kFormatNone = 0, kRangeInverse = 1, kRangeLinear = 2 };
     19 
     20 //  The Units of the depth map. Please see the Depth Map element in the Dynamic
     21 //  Depth specification.
     22 enum class DepthUnits { kUnitsNone = 0, kMeters = 1, kDiopters = 2 };
     23 
     24 // The type of depth measurement. Please see the Depth Map element in the
     25 // Dynamic Depth specification.
     26 enum class DepthMeasureType { kOpticalAxis = 1, kOpticRay = 2 };
     27 
     28 // The semantics of this depth map.
     29 enum class DepthItemSemantic { kDepth = 1, kSegmentation = 2 };
     30 
     31 struct DepthMapParams {
     32   // Mandatory values.
     33   DepthFormat format;
     34   float near;
     35   float far;
     36   DepthUnits units;
     37   string depth_uri;
     38   string mime;
     39   DepthItemSemantic item_semantic = DepthItemSemantic::kDepth;
     40 
     41   // The bytes of the depth image. Must be non-empty at write-time (i.e.
     42   // programmatic construction).
     43   string depth_image_data = "";
     44 
     45   // Optional values.
     46   DepthMeasureType measure_type = DepthMeasureType::kOpticalAxis;
     47   string confidence_uri = "";
     48   // The bytes of the confidence map. If confidence_uri is not empty, the
     49   // confidence data must be non-empty at write-time (i.e. programmatic
     50   // construction).
     51   string confidence_data = "";
     52   string software = "";
     53 
     54   // A list of (distance, radius) pairs. This should generally have a short
     55   // length, so copying is expected to be inexpensive.
     56   std::vector<float> focal_table;
     57 
     58   explicit DepthMapParams(DepthFormat in_format, float in_near, float in_far,
     59                           DepthUnits in_units, string in_depth_uri)
     60       : format(in_format),
     61         near(in_near),
     62         far(in_far),
     63         units(in_units),
     64         depth_uri(in_depth_uri) {}
     65 
     66   inline bool operator==(const DepthMapParams& other) const {
     67     return format == other.format && near == other.near && far == other.far &&
     68            units == other.units && depth_uri == other.depth_uri &&
     69            depth_image_data == other.depth_image_data &&
     70            measure_type == other.measure_type &&
     71            confidence_uri == other.confidence_uri &&
     72            confidence_data == other.confidence_data &&
     73            software == other.software && focal_table == other.focal_table;
     74   }
     75 
     76   inline bool operator!=(const DepthMapParams& other) const {
     77     return !(*this == other);
     78   }
     79 };
     80 
     81 // Implements the Depth Map element from the Dynamic Depth specification, with
     82 // serialization and deserialization.
     83 class DepthMap : public Element {
     84  public:
     85   void GetNamespaces(
     86       std::unordered_map<string, string>* ns_name_href_map) override;
     87 
     88   bool Serialize(
     89       ::dynamic_depth::xmpmeta::xml::Serializer* serializer) const override;
     90 
     91   // Creates a DepthMap from the given objects in params.
     92   static std::unique_ptr<DepthMap> FromData(
     93       const DepthMapParams& params, std::vector<std::unique_ptr<Item>>* items);
     94 
     95   // Returns the deserialized DepthMap object, null if parsing fails.
     96   // Not sensitive to case when parsing the Format, Units, or MeasureType
     97   // fields.
     98   static std::unique_ptr<DepthMap> FromDeserializer(
     99       const ::dynamic_depth::xmpmeta::xml::Deserializer& parent_deserializer);
    100 
    101   DepthFormat GetFormat() const;
    102   float GetNear() const;
    103   float GetFar() const;
    104   DepthUnits GetUnits() const;
    105   const string GetDepthUri() const;
    106   DepthItemSemantic GetItemSemantic() const;
    107   const string GetConfidenceUri() const;
    108   DepthMeasureType GetMeasureType() const;
    109   const string GetSoftware() const;
    110   const std::vector<float>& GetFocalTable() const;
    111   size_t GetFocalTableEntryCount() const;
    112 
    113   // Disallow copying
    114   DepthMap(const DepthMap&) = delete;
    115   void operator=(const DepthMap&) = delete;
    116 
    117  private:
    118   explicit DepthMap(const DepthMapParams& params);
    119   static std::unique_ptr<DepthMap> ParseFields(
    120       const ::dynamic_depth::xmpmeta::xml::Deserializer& deserializer);
    121 
    122   DepthMapParams params_;
    123 };
    124 
    125 }  // namespace dynamic_depth
    126 
    127 #endif // DYNAMIC_DEPTH_INCLUDES_DYNAMIC_DEPTH_DEPTH_MAP_H_  // NOLINT
    128