OpenShot Library | libopenshot
0.4.0
|
Go to the documentation of this file.
20 #include "trackerdata.pb.h"
21 #include <google/protobuf/util/time_util.h>
23 using google::protobuf::util::TimeUtil;
34 : delta_x(0.0), delta_y(0.0),
35 scale_x(1.0), scale_y(1.0), rotation(0.0),
36 background_alpha(0.0), background_corner(12),
37 stroke_width(2) , stroke_alpha(0.7),
38 stroke(Red, Green, Blue, Alfa),
39 background(0, 0, 255, Alfa)
41 this->TimeScale = 1.0;
52 BBox newBBox =
BBox(_cx, _cy, _width, _height, _angle);
57 auto BBoxIterator =
BoxVec.find(time);
59 if (BBoxIterator !=
BoxVec.end())
62 BBoxIterator->second = newBBox;
67 BoxVec.insert({time, newBBox});
87 auto it =
BoxVec.lower_bound(time);
101 auto it =
BoxVec.find(time);
115 auto it =
BoxVec.find(time);
128 double time = this->
FrameNToTime(frame_number, this->TimeScale);
132 auto currentBBoxIterator =
BoxVec.lower_bound(time);
135 if (currentBBoxIterator ==
BoxVec.end())
143 if ((currentBBoxIterator->first == time) || (currentBBoxIterator ==
BoxVec.begin()))
146 BBox currentBBox = currentBBoxIterator->second;
159 BBox currentBBox = currentBBoxIterator->second;
161 BBox previousBBox = prev(currentBBoxIterator, 1)->second;
164 BBox interpolatedBBox =
InterpolateBoxes(prev(currentBBoxIterator, 1)->first, currentBBoxIterator->first,
165 previousBBox, currentBBox, time);
174 return interpolatedBBox;
208 return interpolatedBox;
224 double time = ((double)frame_number) * this->BaseFps.
Reciprocal().
ToDouble() * (1.0 / time_scale);
231 this->TimeScale = time_scale;
240 pb_tracker::Tracker bboxMessage;
243 std::fstream input(inputFilePath, ios::in | ios::binary);
246 if (!bboxMessage.ParseFromIstream(&input))
248 std::cerr <<
"Failed to parse protobuf message." << std::endl;
255 for (
size_t i = 0; i < bboxMessage.frame_size(); i++)
258 const pb_tracker::Frame &pbFrameData = bboxMessage.frame(i);
261 size_t frame_number = pbFrameData.id();
264 const pb_tracker::Frame::Box &box = pbFrameData.bounding_box();
266 float width = box.x2() - box.x1();
267 float height = box.y2() - box.y1();
268 float cx = box.x1() + width/2;
269 float cy = box.y1() + height/2;
273 if ( (cx >= 0.0) && (cy >= 0.0) && (width >= 0.0) && (height >= 0.0) )
276 this->
AddBox(frame_number, cx, cy, width, height, angle);
281 if (bboxMessage.has_last_updated())
283 std::cout <<
" Loaded Data. Saved Time Stamp: "
284 << TimeUtil::ToString(bboxMessage.last_updated()) << std::endl;
288 google::protobuf::ShutdownProtobufLibrary();
313 root[
"box_id"] =
Id();
314 root[
"BaseFPS"][
"num"] = BaseFps.
num;
315 root[
"BaseFPS"][
"den"] = BaseFps.
den;
316 root[
"TimeScale"] = TimeScale;
347 catch (
const std::exception &e)
350 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
360 if (!root[
"box_id"].isNull() && root[
"box_id"].asString() !=
"")
361 Id(root[
"box_id"].asString());
364 if (!root[
"BaseFPS"].isNull() && root[
"BaseFPS"].isObject())
366 if (!root[
"BaseFPS"][
"num"].isNull())
367 BaseFps.
num = (int)root[
"BaseFPS"][
"num"].asInt();
368 if (!root[
"BaseFPS"][
"den"].isNull())
369 BaseFps.
den = (
int)root[
"BaseFPS"][
"den"].asInt();
372 if (!root[
"TimeScale"].isNull())
374 double scale = (double)root[
"TimeScale"].asDouble();
378 if (!root[
"protobuf_data_path"].isNull())
382 if (!root[
"delta_x"].isNull())
384 if (!root[
"delta_y"].isNull())
386 if (!root[
"scale_x"].isNull())
388 if (!root[
"scale_y"].isNull())
390 if (!root[
"rotation"].isNull())
392 if (!root[
"visible"].isNull())
394 if (!root[
"draw_box"].isNull())
396 if (!root[
"stroke"].isNull())
398 if (!root[
"background_alpha"].isNull())
400 if (!root[
"background_corner"].isNull())
402 if (!root[
"background"].isNull())
404 if (!root[
"stroke_width"].isNull())
406 if (!root[
"stroke_alpha"].isNull())
420 root[
"box_id"] =
add_property_json(
"Box ID", 0.0,
"string",
Id(), NULL, -1, -1,
true, requested_frame);
440 root[
"stroke"] =
add_property_json(
"Border", 0.0,
"color",
"", NULL, 0, 255,
false, requested_frame);
450 root[
"background"] =
add_property_json(
"Background", 0.0,
"color",
"", NULL, 0, 255,
false, requested_frame);
464 const Point requested_point(requested_frame, requested_frame);
467 Json::Value prop = Json::Value(Json::objectValue);
469 prop[
"value"] = value;
472 prop[
"min"] = min_value;
473 prop[
"max"] = max_value;
475 prop[
"keyframe"] = keyframe->
Contains(requested_point);
476 prop[
"points"] = int(keyframe->
GetCount());
479 prop[
"closest_point_x"] = closest_point.
co.
X;
483 prop[
"keyframe"] =
false;
486 prop[
"closest_point_x"] = -1;
487 prop[
"previous_point_x"] = -1;
490 prop[
"readonly"] = readonly;
491 prop[
"choices"] = Json::Value(Json::arrayValue);
501 std::map<std::string, float> boxValues;
507 boxValues[
"cx"] = box.
cx;
508 boxValues[
"cy"] = box.
cy;
509 boxValues[
"w"] = box.
width;
510 boxValues[
"h"] = box.
height;
511 boxValues[
"ang"] = box.
angle;
const Json::Value stringToJson(const std::string value)
Json::Value PropertiesJSON(int64_t requested_frame) const override
Keyframe stroke_alpha
Stroke box opacity.
Keyframe rotation
Rotation Keyframe.
void AddBox(int64_t _frame_num, float _cx, float _cy, float _width, float _height, float _angle) override
Add a BBox to the BoxVec map.
double Y
The Y value of the coordinate (usually representing the value of the property being animated)
Header file for Clip class.
float height
bounding box height
bool Contains(int64_t frame_number) const
Check if there is a bounding-box in the given frame.
Json::Value JsonValue() const override
Generate Json::Value for this object.
Color background
Background fill color.
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
InterpolationType interpolation
This is the interpolation mode.
This namespace is the default namespace for all code in the openshot library.
Coordinate co
This is the primary coordinate.
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
double FrameNToTime(int64_t frame_number, double time_scale) const
Get the time of the given frame.
This class represents a fraction.
float cy
y-coordinate of the bounding box center
void ScalePoints(double scale) override
Update the TimeScale member variable.
void SetJsonValue(const Json::Value root)
Load Json::Value into this object.
std::string Json() const override
Get and Set JSON methods.
Fraction GetBaseFPS()
Return the object's BaseFps.
Json::Value add_property_choice_json(std::string name, int value, int selected_value) const
Generate JSON choice for a property (dropdown properties)
bool Contains(Point p) const
Does this keyframe contain a specific point.
Keyframe draw_box
Keyframe to determine if a specific box is drawn (or hidden)
std::string Id() const
Get the id of this object.
double ToDouble() const
Return this fraction as a double (i.e. 1/2 = 0.5)
Keyframe scale_y
Y-direction scale Keyframe.
Json::Value JsonValue() const
Generate Json::Value for this object.
float angle
bounding box rotation angle [degrees]
int num
Numerator for the fraction.
Keyframe visible
Keyframe to track if a box is visible in the current frame (read-only)
This class contains the properties of a tracked object and functions to manipulate it.
int den
Denominator for the fraction.
A Keyframe is a collection of Point instances, which is used to vary a number or property over time.
void SetJsonValue(const Json::Value root)
Load Json::Value into this object.
Fraction Reciprocal() const
Return the reciprocal as a Fraction.
double InterpolateBetween(Point const &left, Point const &right, double target, double allowed_error)
Interpolate two points using the right Point's interpolation method.
Keyframe scale_x
X-direction scale Keyframe.
Exception for invalid JSON.
BBox GetBox(int64_t frame_number)
Return a bounding-box from BoxVec with it's properties adjusted by the Keyframes.
TrackedObjectBBox()
Default Constructor.
float width
bounding box width
openshot::Keyframe green
Curve representing the green value (0 - 255)
BBox InterpolateBoxes(double t1, double t2, BBox left, BBox right, double target)
Interpolate the bouding-boxes properties.
Keyframe delta_y
Y-direction displacement Keyframe.
void RemoveBox(int64_t frame_number)
Remove a bounding-box from the BoxVec map.
std::map< double, BBox > BoxVec
Index the bounding-box by time of each 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.
@ LINEAR
Linear curves are angular, straight lines between two points.
Json::Value JsonValue() const
Generate Json::Value for this object.
Point GetClosestPoint(Point p) const
Get current point (or closest point to the right) from the X coordinate (i.e. the frame number)
Keyframe delta_x
X-direction displacement Keyframe.
This struct holds the information of a bounding-box.
bool LoadBoxData(std::string inputFilePath)
Load the bounding-boxes information from the protobuf file.
void clear()
Clear the BoxVec map.
void SetBaseFPS(Fraction fps)
Update object's BaseFps.
void SetJson(const std::string value) override
Load JSON string into this object.
Color stroke
Border line color.
bool ExactlyContains(int64_t frame_number) const override
Check if there is a bounding-box in the exact frame number.
std::string protobufDataPath
Path to the protobuf file that holds the bounding box points across the frames.
int64_t GetCount() const
Get the number of points (i.e. # of points)
@ CONSTANT
Constant curves jump from their previous position to a new one (with no interpolation).
Point GetPreviousPoint(Point p) const
Get previous point (.
Header file for the TrackedObjectBBox class.
float cx
x-coordinate of the bounding box center
Keyframe stroke_width
Thickness of border line.
openshot::Keyframe red
Curve representing the red value (0 - 255)
Keyframe background_corner
Radius of rounded corners.
A Point is the basic building block of a key-frame curve.
openshot::Keyframe blue
Curve representing the red value (0 - 255)
double X
The X value of the coordinate (usually representing the frame #)
double GetValue(int64_t index) const
Get the value at a specific index.
Keyframe background_alpha
Background box opacity.
int64_t GetLength() const
Get the size of BoxVec map.