20 #include "trackerdata.pb.h" 21 #include <google/protobuf/util/time_util.h> 23 using google::protobuf::util::TimeUtil;
38 stroke(Red, Green, Blue, Alfa),
41 this->TimeScale = 1.0;
53 BBox newBBox =
BBox(_cx, _cy, _width, _height, _angle);
58 auto BBoxIterator =
BoxVec.find(time);
60 if (BBoxIterator !=
BoxVec.end())
63 BBoxIterator->second = newBBox;
68 BoxVec.insert({time, newBBox});
88 auto it =
BoxVec.lower_bound(time);
102 auto it =
BoxVec.find(time);
116 auto it =
BoxVec.find(time);
129 double time = this->
FrameNToTime(frame_number, this->TimeScale);
133 auto currentBBoxIterator =
BoxVec.lower_bound(time);
136 if (currentBBoxIterator ==
BoxVec.end())
144 if ((currentBBoxIterator->first == time) || (currentBBoxIterator ==
BoxVec.begin()))
147 BBox currentBBox = currentBBoxIterator->second;
160 BBox currentBBox = currentBBoxIterator->second;
162 BBox previousBBox = prev(currentBBoxIterator, 1)->second;
165 BBox interpolatedBBox =
InterpolateBoxes(prev(currentBBoxIterator, 1)->first, currentBBoxIterator->first,
166 previousBBox, currentBBox, time);
175 return interpolatedBBox;
209 return interpolatedBox;
225 double time = ((double)frame_number) * this->BaseFps.
Reciprocal().
ToDouble() * (1.0 / time_scale);
232 this->TimeScale = time_scale;
241 pb_tracker::Tracker bboxMessage;
244 std::fstream input(inputFilePath, ios::in | ios::binary);
247 if (!bboxMessage.ParseFromIstream(&input))
249 std::cerr <<
"Failed to parse protobuf message." << std::endl;
256 for (
size_t i = 0; i < bboxMessage.frame_size(); i++)
259 const pb_tracker::Frame &pbFrameData = bboxMessage.frame(i);
262 size_t frame_number = pbFrameData.id();
265 const pb_tracker::Frame::Box &box = pbFrameData.bounding_box();
267 float width = box.x2() - box.x1();
268 float height = box.y2() - box.y1();
269 float cx = box.x1() + width/2;
270 float cy = box.y1() + height/2;
274 if ( (cx >= 0.0) && (cy >= 0.0) && (width >= 0.0) && (height >= 0.0) )
277 this->
AddBox(frame_number, cx, cy, width, height, angle);
282 if (bboxMessage.has_last_updated())
284 std::cout <<
" Loaded Data. Saved Time Stamp: " 285 << TimeUtil::ToString(bboxMessage.last_updated()) << std::endl;
289 google::protobuf::ShutdownProtobufLibrary();
314 root[
"box_id"] =
Id();
315 root[
"BaseFPS"][
"num"] = BaseFps.
num;
316 root[
"BaseFPS"][
"den"] = BaseFps.
den;
317 root[
"TimeScale"] = TimeScale;
349 catch (
const std::exception &e)
352 throw InvalidJSON(
"JSON is invalid (missing keys or invalid data types)");
362 if (!root[
"box_id"].isNull() && root[
"box_id"].asString() !=
"")
363 Id(root[
"box_id"].asString());
366 if (!root[
"BaseFPS"].isNull() && root[
"BaseFPS"].isObject())
368 if (!root[
"BaseFPS"][
"num"].isNull())
369 BaseFps.
num = (int)root[
"BaseFPS"][
"num"].asInt();
370 if (!root[
"BaseFPS"][
"den"].isNull())
371 BaseFps.
den = (
int)root[
"BaseFPS"][
"den"].asInt();
374 if (!root[
"TimeScale"].isNull())
376 double scale = (double)root[
"TimeScale"].asDouble();
380 if (!root[
"protobuf_data_path"].isNull())
384 if (!root[
"child_clip_id"].isNull() && root[
"child_clip_id"].asString() !=
"" && root[
"child_clip_id"].asString() !=
Id()){
387 if (root[
"child_clip_id"].asString() != parentClip->
Id())
392 if (!root[
"delta_x"].isNull())
394 if (!root[
"delta_y"].isNull())
396 if (!root[
"scale_x"].isNull())
398 if (!root[
"scale_y"].isNull())
400 if (!root[
"rotation"].isNull())
402 if (!root[
"visible"].isNull())
404 if (!root[
"draw_box"].isNull())
406 if (!root[
"stroke"].isNull())
408 if (!root[
"background_alpha"].isNull())
410 if (!root[
"background_corner"].isNull())
412 if (!root[
"background"].isNull())
414 if (!root[
"stroke_width"].isNull())
416 if (!root[
"stroke_alpha"].isNull())
430 root[
"box_id"] =
add_property_json(
"Box ID", 0.0,
"string",
Id(), NULL, -1, -1,
true, requested_frame);
453 root[
"stroke"] =
add_property_json(
"Border", 0.0,
"color",
"", NULL, 0, 255,
false, requested_frame);
463 root[
"background"] =
add_property_json(
"Background", 0.0,
"color",
"", NULL, 0, 255,
false, requested_frame);
477 const Point requested_point(requested_frame, requested_frame);
480 Json::Value prop = Json::Value(Json::objectValue);
482 prop[
"value"] = value;
485 prop[
"min"] = min_value;
486 prop[
"max"] = max_value;
488 prop[
"keyframe"] = keyframe->
Contains(requested_point);
489 prop[
"points"] = int(keyframe->
GetCount());
492 prop[
"closest_point_x"] = closest_point.co.X;
496 prop[
"keyframe"] =
false;
499 prop[
"closest_point_x"] = -1;
500 prop[
"previous_point_x"] = -1;
503 prop[
"readonly"] = readonly;
504 prop[
"choices"] = Json::Value(Json::arrayValue);
514 std::map<std::string, float> boxValues;
520 boxValues[
"cx"] = box.
cx;
521 boxValues[
"cy"] = box.
cy;
522 boxValues[
"w"] = box.
width;
523 boxValues[
"h"] = box.
height;
524 boxValues[
"ang"] = box.
angle;
546 float parentClip_frame_number = round(frame_number - parentClip_start_position) + parentClip_start_frame;
549 float parentClip_location_x = parentClip->
location_x.
GetValue(parentClip_frame_number);
550 float parentClip_location_y = parentClip->
location_y.
GetValue(parentClip_frame_number);
551 float parentClip_scale_x = parentClip->
scale_x.
GetValue(parentClip_frame_number);
552 float parentClip_scale_y = parentClip->
scale_y.
GetValue(parentClip_frame_number);
553 float parentClip_rotation = parentClip->
rotation.
GetValue(parentClip_frame_number);
556 std::map<std::string, float> parentClipProperties;
559 parentClipProperties[
"frame_number"] = parentClip_frame_number;
560 parentClipProperties[
"timeline_frame_number"] = frame_number;
561 parentClipProperties[
"location_x"] = parentClip_location_x;
562 parentClipProperties[
"location_y"] = parentClip_location_y;
563 parentClipProperties[
"scale_x"] = parentClip_scale_x;
564 parentClipProperties[
"scale_y"] = parentClip_scale_y;
565 parentClipProperties[
"rotation"] = parentClip_rotation;
567 return parentClipProperties;
void SetJsonValue(const Json::Value root)
Load Json::Value into this object.
int num
Numerator for the fraction.
bool ExactlyContains(int64_t frame_number) const override
Check if there is a bounding-box in the exact frame number.
Json::Value PropertiesJSON(int64_t requested_frame) const override
Json::Value JsonValue() const override
Generate Json::Value for this object.
std::string Id() const
Get the Id of this clip object.
void clear()
Clear the BoxVec map.
float Start() const
Get start position (in seconds) of clip (trim start of video)
float cy
y-coordinate of the bounding box center
ClipBase * ParentClip() const
Get and set the parentClip of this object.
Keyframe background_alpha
Background box opacity.
InterpolationType interpolation
This is the interpolation mode.
openshot::Keyframe location_y
Curve representing the relative Y position in percent based on the gravity (-1 to 1) ...
float height
bounding box height
Keyframe stroke_alpha
Stroke box opacity.
Json::Value add_property_choice_json(std::string name, int value, int selected_value) const
Generate JSON choice for a property (dropdown properties)
void SetBaseFPS(Fraction fps)
Update object's BaseFps.
double ToDouble() const
Return this fraction as a double (i.e. 1/2 = 0.5)
Keyframe delta_y
Y-direction displacement Keyframe.
A Point is the basic building block of a key-frame curve.
std::map< std::string, float > GetParentClipProperties(int64_t frame_number) const override
Return a map that contains the properties of this object's parent clip.
openshot::Keyframe scale_x
Curve representing the horizontal scaling in percent (0 to 1)
Point GetPreviousPoint(Point p) const
Get previous point (.
const Json::Value stringToJson(const std::string value)
openshot::Keyframe scale_y
Curve representing the vertical scaling in percent (0 to 1)
bool Contains(Point p) const
Does this keyframe contain a specific point.
float angle
bounding box rotation angle [degrees]
openshot::Keyframe blue
Curve representing the red value (0 - 255)
Keyframe stroke_width
Thickness of border line.
Color background
Background fill color.
std::string protobufDataPath
Path to the protobuf file that holds the bounding box points across the frames.
Color stroke
Border line color.
bool LoadBoxData(std::string inputFilePath)
Load the bounding-boxes information from the protobuf file.
BBox InterpolateBoxes(double t1, double t2, BBox left, BBox right, double target)
Interpolate the bouding-boxes properties.
This class represents a clip (used to arrange readers on the timeline)
double Y
The Y value of the coordinate (usually representing the value of the property being animated) ...
Keyframe delta_x
X-direction displacement Keyframe.
openshot::Keyframe green
Curve representing the green value (0 - 255)
Point GetClosestPoint(Point p) const
Get current point (or closest point to the right) from the X coordinate (i.e. the frame number) ...
BBox GetBox(int64_t frame_number)
Return a bounding-box from BoxVec with it's properties adjusted by the Keyframes. ...
openshot::Keyframe rotation
Curve representing the rotation (0 to 360)
Header file for Clip class.
float width
bounding box width
This class represents a fraction.
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...
Fraction GetBaseFPS()
Return the object's BaseFps.
double InterpolateBetween(Point const &left, Point const &right, double target, double allowed_error)
Interpolate two points using the right Point's interpolation method.
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.
void RemoveBox(int64_t frame_number)
Remove a bounding-box from the BoxVec map.
Fraction Reciprocal() const
Return the reciprocal as a Fraction.
std::map< double, BBox > BoxVec
Index the bounding-box by time of each frame.
double X
The X value of the coordinate (usually representing the frame #)
void SetJson(const std::string value) override
Load JSON string into this object.
This struct holds the information of a bounding-box.
Keyframe scale_y
Y-direction scale Keyframe.
TrackedObjectBBox()
Default Constructor.
void ScalePoints(double scale) override
Update the TimeScale member variable.
openshot::ReaderInfo info
Information about the current media file.
Header file for the TrackedObjectBBox class.
int64_t GetLength() const
Get the size of BoxVec map.
std::string ChildClipId() const
Get and set the Id of the childClip of this object.
void SetJsonValue(const Json::Value root)
Load Json::Value into this object.
Keyframe rotation
Rotation Keyframe.
This namespace is the default namespace for all code in the openshot library.
Keyframe scale_x
X-direction scale Keyframe.
void SetJsonValue(const Json::Value root) override
Load Json::Value into this object.
float cx
x-coordinate of the bounding box center
Json::Value JsonValue() const
Generate Json::Value for this object.
Linear curves are angular, straight lines between two points.
Coordinate co
This is the primary coordinate.
Exception for invalid JSON.
std::string Id() const
Get the id of this object.
int64_t GetCount() const
Get the number of points (i.e. # of points)
double GetValue(int64_t index) const
Get the value at a specific index.
void AddBox(int64_t _frame_num, float _cx, float _cy, float _width, float _height, float _angle) override
Add a BBox to the BoxVec map.
openshot::Keyframe red
Curve representing the red value (0 - 255)
bool Contains(int64_t frame_number) const
Check if there is a bounding-box in the given frame.
openshot::Keyframe location_x
Curve representing the relative X position in percent based on the gravity (-1 to 1) ...
float Position() const
Get position on timeline (in seconds)
std::string Json() const override
Get and Set JSON methods.
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...
Keyframe background_corner
Radius of rounded corners.
This class contains the properties of a tracked object and functions to manipulate it...
openshot::Fraction fps
Frames per second, as a fraction (i.e. 24/1 = 24 fps)
Constant curves jump from their previous position to a new one (with no interpolation).
Json::Value JsonValue() const
Generate Json::Value for this object.