OpenShot Library | libopenshot  1.0.0
TrackedObjectBBox.h
Go to the documentation of this file.
1 
10 // Copyright (c) 2008-2019 OpenShot Studios, LLC
11 //
12 // SPDX-License-Identifier: LGPL-3.0-or-later
13 
14 #ifndef OPENSHOT_TRACKEDOBJECTBBOX_H
15 #define OPENSHOT_TRACKEDOBJECTBBOX_H
16 
17 #include "TrackedObjectBase.h"
18 
19 #include "Color.h"
20 #include "Exceptions.h"
21 #include "Fraction.h"
22 #include "Json.h"
23 #include "KeyFrame.h"
24 
25 namespace openshot
26 {
28  {
29  int width = 0;
30  int height = 0;
31  std::vector<uint32_t> rle;
32 
33  bool HasData() const { return width > 0 && height > 0 && !rle.empty(); }
34  };
35 
46  struct BBox
47  {
48  float cx = -1;
49  float cy = -1;
50  float width = -1;
51  float height = -1;
52  float angle = -1;
53 
55  BBox() {}
56 
63  BBox(float _cx, float _cy, float _width, float _height, float _angle)
64  {
65  cx = _cx;
66  cy = _cy;
67  width = _width;
68  height = _height;
69  angle = _angle;
70  }
71 
72 
74  std::string Json() const
75  {
76  return JsonValue().toStyledString();
77  }
78 
80  Json::Value JsonValue() const
81  {
82  Json::Value root;
83  root["cx"] = cx;
84  root["cy"] = cy;
85  root["width"] = width;
86  root["height"] = height;
87  root["angle"] = angle;
88 
89  return root;
90  }
91 
93  void SetJson(const std::string value)
94  {
95  // Parse JSON string into JSON objects
96  try
97  {
98  const Json::Value root = openshot::stringToJson(value);
99  // Set all values that match
100  SetJsonValue(root);
101  }
102  catch (const std::exception &e)
103  {
104  // Error parsing JSON (or missing keys)
105  throw InvalidJSON("JSON is invalid (missing keys or invalid data types)");
106  }
107  }
108 
110  void SetJsonValue(const Json::Value root)
111  {
112 
113  // Set data from Json (if key is found)
114  if (!root["cx"].isNull())
115  cx = root["cx"].asDouble();
116  if (!root["cy"].isNull())
117  cy = root["cy"].asDouble();
118  if (!root["width"].isNull())
119  width = root["width"].asDouble();
120  if (!root["height"].isNull())
121  height = root["height"].asDouble();
122  if (!root["angle"].isNull())
123  angle = root["angle"].asDouble();
124  }
125  };
126 
140  {
141  private:
142  Fraction BaseFps;
143  double TimeScale;
144 
145  public:
146  std::map<double, BBox> BoxVec;
147  std::map<double, ObjectMaskData> MaskVec;
160 
161  std::string protobufDataPath;
162 
165  TrackedObjectBBox(int Red, int Green, int Blue, int Alfa);
166 
168  void AddBox(int64_t _frame_num, float _cx, float _cy, float _width, float _height, float _angle) override;
169  void AddMask(int64_t frame_num, const ObjectMaskData& mask);
170  bool HasMask(int64_t frame_number, int64_t max_frame_gap = 0) const;
171  bool HasMaskData() const;
172  ObjectMaskData GetMask(int64_t frame_number, int64_t max_frame_gap = 0) const;
173 
175  void SetBaseFPS(Fraction fps);
176 
179 
181  void ScalePoints(double scale) override;
182 
184  bool Contains(int64_t frame_number) const;
186  bool ExactlyContains(int64_t frame_number) const override;
187 
189  int64_t GetLength() const;
190 
192  void RemoveBox(int64_t frame_number);
193 
195  BBox GetBox(int64_t frame_number);
197  BBox GetBox(int64_t frame_number) const
198  {
199  return const_cast<TrackedObjectBBox *>(this)->GetBox(frame_number);
200  }
201 
203  double ScaledStrokeWidth(int64_t frame_number, int image_width, int image_height) const;
204 
206  bool LoadBoxData(std::string inputFilePath);
207 
209  double FrameNToTime(int64_t frame_number, double time_scale) const;
210 
212  BBox InterpolateBoxes(double t1, double t2, BBox left, BBox right, double target);
213 
215  void clear();
216 
218  std::string Json() const override;
219  Json::Value JsonValue() const override;
220  void SetJson(const std::string value) override;
221  void SetJsonValue(const Json::Value root) override;
222 
225  Json::Value PropertiesJSON(int64_t requested_frame) const override;
226 
227  // Generate JSON for a property
228  Json::Value add_property_json(std::string name, float value, std::string type, std::string memo, const Keyframe* keyframe, float min_value, float max_value, bool readonly, int64_t requested_frame) const;
229 
231  std::map<std::string, float> GetBoxValues(int64_t frame_number) const override;
232  };
233 } // namespace openshot
234 
235 #endif
Header file for Color class.
Header file for all Exception classes.
Header file for Fraction class.
Header file for JSON class.
Header file for the Keyframe class.
Header file for the TrackedObjectBase class.
This class represents a color (used on the timeline and clips)
Definition: Color.h:27
This class represents a fraction.
Definition: Fraction.h:30
Exception for invalid JSON.
Definition: Exceptions.h:224
A Keyframe is a collection of Point instances, which is used to vary a number or property over time.
Definition: KeyFrame.h:53
This class contains the properties of a tracked object and functions to manipulate it.
Keyframe delta_x
X-direction displacement Keyframe.
Color mask_color
Object mask overlay color.
bool LoadBoxData(std::string inputFilePath)
Load the bounding-boxes information from the protobuf file.
Color stroke
Border line color.
int64_t GetLength() const
Get the size of BoxVec map.
Keyframe stroke_width
Thickness of border line.
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
std::map< double, ObjectMaskData > MaskVec
Index optional object masks by time of each frame.
void AddBox(int64_t _frame_num, float _cx, float _cy, float _width, float _height, float _angle) override
Add a BBox to the BoxVec map.
TrackedObjectBBox()
Default Constructor.
void SetBaseFPS(Fraction fps)
Update object's BaseFps.
void SetJson(const std::string value) override
Load JSON string into this object.
Json::Value add_property_json(std::string name, float value, std::string type, std::string memo, const Keyframe *keyframe, float min_value, float max_value, bool readonly, int64_t requested_frame) const
void clear()
Clear the BoxVec map.
Keyframe delta_y
Y-direction displacement Keyframe.
Keyframe mask_alpha
Object mask overlay opacity.
Color background
Background fill color.
double ScaledStrokeWidth(int64_t frame_number, int image_width, int image_height) const
Return stroke width adjusted for source-to-output raster scaling.
BBox GetBox(int64_t frame_number) const
Const-cast of the GetBox function, so that it can be called inside other cont function.
std::map< double, BBox > BoxVec
Index the bounding-box by time of each frame.
std::string Json() const override
Get and Set JSON methods.
bool ExactlyContains(int64_t frame_number) const override
Check if there is a bounding-box in the exact frame number.
void ScalePoints(double scale) override
Update the TimeScale member variable.
void AddMask(int64_t frame_num, const ObjectMaskData &mask)
BBox InterpolateBoxes(double t1, double t2, BBox left, BBox right, double target)
Interpolate the bouding-boxes properties.
Fraction GetBaseFPS()
Return the object's BaseFps.
Json::Value PropertiesJSON(int64_t requested_frame) const override
Keyframe background_alpha
Background box opacity.
void RemoveBox(int64_t frame_number)
Remove a bounding-box from the BoxVec map.
bool HasMask(int64_t frame_number, int64_t max_frame_gap=0) const
bool Contains(int64_t frame_number) const
Check if there is a bounding-box in the given frame.
std::map< std::string, float > GetBoxValues(int64_t frame_number) const override
Return a map that contains the bounding box properties and it's keyframes indexed by their names.
Json::Value JsonValue() const override
Generate Json::Value for this object.
Keyframe scale_y
Y-direction scale Keyframe.
std::string protobufDataPath
Path to the protobuf file that holds the bounding box points across the frames.
Keyframe stroke_alpha
Stroke box opacity.
double FrameNToTime(int64_t frame_number, double time_scale) const
Get the time of the given frame.
Keyframe scale_x
X-direction scale Keyframe.
BBox GetBox(int64_t frame_number)
Return a bounding-box from BoxVec with it's properties adjusted by the Keyframes.
ObjectMaskData GetMask(int64_t frame_number, int64_t max_frame_gap=0) const
Keyframe background_corner
Radius of rounded corners.
This abstract class is the base class of all Tracked Objects.
This namespace is the default namespace for all code in the openshot library.
Definition: AnimatedCurve.h:24
const Json::Value stringToJson(const std::string value)
Definition: Json.cpp:16
This struct holds the information of a bounding-box.
float cy
y-coordinate of the bounding box center
float height
bounding box height
float cx
x-coordinate of the bounding box center
std::string Json() const
Generate JSON string of this object.
void SetJson(const std::string value)
Load JSON string into this object.
Json::Value JsonValue() const
Generate Json::Value for this object.
void SetJsonValue(const Json::Value root)
Load Json::Value into this object.
BBox(float _cx, float _cy, float _width, float _height, float _angle)
BBox()
Blank constructor.
float width
bounding box width
float angle
bounding box rotation angle [degrees]
std::vector< uint32_t > rle