diff --git a/src/Clip.cpp b/src/Clip.cpp index 3b259928..888e17e9 100644 --- a/src/Clip.cpp +++ b/src/Clip.cpp @@ -789,38 +789,8 @@ std::string Clip::PropertiesJSON(int64_t requested_frame) const { root["waveform"]["choices"].append(add_property_choice_json("Yes", true, waveform)); root["waveform"]["choices"].append(add_property_choice_json("No", false, waveform)); - // Add the parentTrackedObject's properties - if (parentTrackedObject && parentClipObject) - { - // Convert Clip's frame position to Timeline's frame position - long clip_start_position = round(Position() * info.fps.ToDouble()) + 1; - long clip_start_frame = (Start() * info.fps.ToDouble()) + 1; - double timeline_frame_number = requested_frame + clip_start_position - clip_start_frame; - - // Get attached object's parent clip properties - std::map< std::string, float > trackedObjectParentClipProperties = parentTrackedObject->GetParentClipProperties(timeline_frame_number); - double parentObject_frame_number = trackedObjectParentClipProperties["frame_number"]; - // Get attached object properties - std::map< std::string, float > trackedObjectProperties = parentTrackedObject->GetBoxValues(parentObject_frame_number); - - // Correct the parent Tracked Object properties by the clip's reference system - float parentObject_location_x = trackedObjectProperties["cx"] - 0.5 + trackedObjectParentClipProperties["cx"]; - float parentObject_location_y = trackedObjectProperties["cy"] - 0.5 + trackedObjectParentClipProperties["cy"]; - float parentObject_scale_x = trackedObjectProperties["w"]*trackedObjectProperties["sx"]; - float parentObject_scale_y = trackedObjectProperties["h"]*trackedObjectProperties["sy"]; - float parentObject_rotation = trackedObjectProperties["r"] + trackedObjectParentClipProperties["r"]; - - // Add the parent Tracked Object properties to JSON - root["location_x"] = add_property_json("Location X", parentObject_location_x, "float", "", &location_x, -1.0, 1.0, false, requested_frame); - root["location_y"] = add_property_json("Location Y", parentObject_location_y, "float", "", &location_y, -1.0, 1.0, false, requested_frame); - root["scale_x"] = add_property_json("Scale X", parentObject_scale_x, "float", "", &scale_x, 0.0, 1.0, false, requested_frame); - root["scale_y"] = add_property_json("Scale Y", parentObject_scale_y, "float", "", &scale_y, 0.0, 1.0, false, requested_frame); - root["rotation"] = add_property_json("Rotation", parentObject_rotation, "float", "", &rotation, -360, 360, false, requested_frame); - root["shear_x"] = add_property_json("Shear X", shear_x.GetValue(requested_frame), "float", "", &shear_x, -1.0, 1.0, false, requested_frame); - root["shear_y"] = add_property_json("Shear Y", shear_y.GetValue(requested_frame), "float", "", &shear_y, -1.0, 1.0, false, requested_frame); - } // Add the parentClipObject's properties - else if (parentClipObject) + if (parentClipObject) { // Convert Clip's frame position to Timeline's frame position long clip_start_position = round(Position() * info.fps.ToDouble()) + 1; @@ -1345,7 +1315,7 @@ void Clip::apply_waveform(std::shared_ptr frame, QSize timeline_size) { frame->AddImage(source_image); } -// Apply keyframes to the source frame (if any) +// Get QTransform from keyframes QTransform Clip::get_transform(std::shared_ptr frame, int width, int height) { // Get image from clip @@ -1440,62 +1410,41 @@ QTransform Clip::get_transform(std::shared_ptr frame, int width, int heig // Get the parentClipObject properties if (parentClipObject){ - - // Convert Clip's frame position to Timeline's frame position - long clip_start_position = round(Position() * info.fps.ToDouble()) + 1; - long clip_start_frame = (Start() * info.fps.ToDouble()) + 1; - double timeline_frame_number = frame->number + clip_start_position - clip_start_frame; + // Get the start trim position of the parent clip + long parent_start_offset = parentClipObject->Start() * info.fps.ToDouble(); + long parent_frame_number = frame->number + parent_start_offset; // Get parent object's properties (Clip) - parentObject_location_x = parentClipObject->location_x.GetValue(timeline_frame_number); - parentObject_location_y = parentClipObject->location_y.GetValue(timeline_frame_number); - parentObject_scale_x = parentClipObject->scale_x.GetValue(timeline_frame_number); - parentObject_scale_y = parentClipObject->scale_y.GetValue(timeline_frame_number); - parentObject_shear_x = parentClipObject->shear_x.GetValue(timeline_frame_number); - parentObject_shear_y = parentClipObject->shear_y.GetValue(timeline_frame_number); - parentObject_rotation = parentClipObject->rotation.GetValue(timeline_frame_number); + parentObject_location_x = parentClipObject->location_x.GetValue(parent_frame_number); + parentObject_location_y = parentClipObject->location_y.GetValue(parent_frame_number); + parentObject_scale_x = parentClipObject->scale_x.GetValue(parent_frame_number); + parentObject_scale_y = parentClipObject->scale_y.GetValue(parent_frame_number); + parentObject_shear_x = parentClipObject->shear_x.GetValue(parent_frame_number); + parentObject_shear_y = parentClipObject->shear_y.GetValue(parent_frame_number); + parentObject_rotation = parentClipObject->rotation.GetValue(parent_frame_number); } - // Get the parentTrackedObject properties - if (parentTrackedObject){ - // Convert Clip's frame position to Timeline's frame position - long clip_start_position = round(Position() * info.fps.ToDouble()) + 1; - long clip_start_frame = (Start() * info.fps.ToDouble()) + 1; - double timeline_frame_number = frame->number + clip_start_position - clip_start_frame; + // Get the parentTrackedObject properties + if (parentTrackedObject){ + // Get the attached object's parent clip's properties + Clip* parentClip = (Clip*) parentTrackedObject->ParentClip(); + if (parentClip) + { + // Get the start trim position of the parent clip + long parent_start_offset = parentClip->Start() * info.fps.ToDouble(); + long parent_frame_number = frame->number + parent_start_offset; - // Get parentTrackedObject's parent clip's properties - std::map trackedObjectParentClipProperties = - parentTrackedObject->GetParentClipProperties(timeline_frame_number); + // Access the parentTrackedObject's properties + std::map trackedObjectProperties = parentTrackedObject->GetBoxValues(parent_frame_number); - // Get the attached object's parent clip's properties - if (!trackedObjectParentClipProperties.empty()) - { - // Get parent object's properties (Tracked Object) - float parentObject_frame_number = trackedObjectParentClipProperties["frame_number"]; - - // Access the parentTrackedObject's properties - std::map trackedObjectProperties = parentTrackedObject->GetBoxValues(parentObject_frame_number); - - // Get the Tracked Object's properties and correct them by the clip's reference system - parentObject_location_x = trackedObjectProperties["cx"] - 0.5 + trackedObjectParentClipProperties["location_x"]; - parentObject_location_y = trackedObjectProperties["cy"] - 0.5 + trackedObjectParentClipProperties["location_y"]; - parentObject_scale_x = trackedObjectProperties["w"]*trackedObjectProperties["sx"]; - parentObject_scale_y = trackedObjectProperties["h"]*trackedObjectProperties["sy"]; - parentObject_rotation = trackedObjectProperties["r"] + trackedObjectParentClipProperties["rotation"]; - } - else - { - // Access the parentTrackedObject's properties - std::map trackedObjectProperties = parentTrackedObject->GetBoxValues(timeline_frame_number); - - // Get the Tracked Object's properties and correct them by the clip's reference system - parentObject_location_x = trackedObjectProperties["cx"] - 0.5; - parentObject_location_y = trackedObjectProperties["cy"] - 0.5; - parentObject_scale_x = trackedObjectProperties["w"]*trackedObjectProperties["sx"]; - parentObject_scale_y = trackedObjectProperties["h"]*trackedObjectProperties["sy"]; - parentObject_rotation = trackedObjectProperties["r"]; - } - } + // Get the Tracked Object's properties and correct them by the clip's reference system + parentObject_location_x = parentClip->location_x.GetValue(parent_frame_number) + ((trackedObjectProperties["cx"] - 0.5) * parentClip->scale_x.GetValue(parent_frame_number)); + parentObject_location_y = parentClip->location_y.GetValue(parent_frame_number) + ((trackedObjectProperties["cy"] - 0.5) * parentClip->scale_y.GetValue(parent_frame_number)); + parentObject_scale_x = trackedObjectProperties["w"] * trackedObjectProperties["sx"] * parentClip->scale_x.GetValue(parent_frame_number); + parentObject_scale_y = trackedObjectProperties["h"] * trackedObjectProperties["sy"] * parentClip->scale_y.GetValue(parent_frame_number); + parentObject_rotation = trackedObjectProperties["r"] + parentClip->rotation.GetValue(parent_frame_number); + } + } /* GRAVITY LOCATION - Initialize X & Y to the correct values (before applying location curves) */ float x = 0.0; // left @@ -1561,8 +1510,8 @@ QTransform Clip::get_transform(std::shared_ptr frame, int width, int heig /* LOCATION, ROTATION, AND SCALE */ float r = rotation.GetValue(frame->number) + parentObject_rotation; // rotate in degrees - x += (width * (location_x.GetValue(frame->number) + parentObject_location_x )); // move in percentage of final width - y += (height * (location_y.GetValue(frame->number) + parentObject_location_y )); // move in percentage of final height + x += width * (location_x.GetValue(frame->number) + parentObject_location_x); // move in percentage of final width + y += height * (location_y.GetValue(frame->number) + parentObject_location_y); // move in percentage of final height float shear_x_value = shear_x.GetValue(frame->number) + parentObject_shear_x; float shear_y_value = shear_y.GetValue(frame->number) + parentObject_shear_y; float origin_x_value = origin_x.GetValue(frame->number); diff --git a/src/TrackedObjectBBox.cpp b/src/TrackedObjectBBox.cpp index d1a1b583..6c81a41a 100644 --- a/src/TrackedObjectBBox.cpp +++ b/src/TrackedObjectBBox.cpp @@ -522,36 +522,3 @@ std::map TrackedObjectBBox::GetBoxValues(int64_t frame_numbe return boxValues; } - -// Return a map that contains the properties of this object's parent clip -std::map TrackedObjectBBox::GetParentClipProperties(int64_t frame_number) const { - - // Get the parent clip of this object as a Clip pointer - Clip* parentClip = (Clip *) ParentClip(); - - // Calculate parentClip's frame number - long parentClip_start_position = round( parentClip->Position() * parentClip->info.fps.ToDouble() ) + 1; - long parentClip_start_frame = ( parentClip->Start() * parentClip->info.fps.ToDouble() ) + 1; - float parentClip_frame_number = round(frame_number - parentClip_start_position) + parentClip_start_frame; - - // Get parentClip's Keyframes - float parentClip_location_x = parentClip->location_x.GetValue(parentClip_frame_number); - float parentClip_location_y = parentClip->location_y.GetValue(parentClip_frame_number); - float parentClip_scale_x = parentClip->scale_x.GetValue(parentClip_frame_number); - float parentClip_scale_y = parentClip->scale_y.GetValue(parentClip_frame_number); - float parentClip_rotation = parentClip->rotation.GetValue(parentClip_frame_number); - - // Initialize the parent clip properties map - std::map parentClipProperties; - - // Set the map properties - parentClipProperties["frame_number"] = parentClip_frame_number; - parentClipProperties["timeline_frame_number"] = frame_number; - parentClipProperties["location_x"] = parentClip_location_x; - parentClipProperties["location_y"] = parentClip_location_y; - parentClipProperties["scale_x"] = parentClip_scale_x; - parentClipProperties["scale_y"] = parentClip_scale_y; - parentClipProperties["rotation"] = parentClip_rotation; - - return parentClipProperties; -} diff --git a/src/TrackedObjectBBox.h b/src/TrackedObjectBBox.h index 1569e566..73ce4b66 100644 --- a/src/TrackedObjectBBox.h +++ b/src/TrackedObjectBBox.h @@ -211,9 +211,6 @@ namespace openshot /// Return a map that contains the bounding box properties and it's keyframes indexed by their names std::map GetBoxValues(int64_t frame_number) const override; - /// Return a map that contains the properties of this object's parent clip - std::map GetParentClipProperties(int64_t frame_number) const override; - }; } // namespace openshot diff --git a/src/TrackedObjectBase.h b/src/TrackedObjectBase.h index faac178a..4922f1e6 100644 --- a/src/TrackedObjectBase.h +++ b/src/TrackedObjectBase.h @@ -66,8 +66,6 @@ namespace openshot { virtual void ScalePoints(double scale) { return; }; /// Return the main properties of a TrackedObjectBBox instance - such as position, size and rotation virtual std::map GetBoxValues(int64_t frame_number) const { std::map ret; return ret; }; - /// Return the main properties of the tracked object's parent clip - such as position, size and rotation - virtual std::map GetParentClipProperties(int64_t frame_number) const { std::map ret; return ret; } /// Add a bounding box to the tracked object's BoxVec map virtual void AddBox(int64_t _frame_num, float _cx, float _cy, float _width, float _height, float _angle) { return; }; diff --git a/src/effects/ObjectDetection.cpp b/src/effects/ObjectDetection.cpp index 4b074a75..7bad798e 100644 --- a/src/effects/ObjectDetection.cpp +++ b/src/effects/ObjectDetection.cpp @@ -82,9 +82,6 @@ std::shared_ptr ObjectDetection::GetFrame(std::shared_ptr frame, i painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); if (detectionsData.find(frame_number) != detectionsData.end()) { - float fw = frame_image->width(); - float fh = frame_image->height(); - DetectionData detections = detectionsData[frame_number]; for (int i = 0; i < detections.boxes.size(); i++) { if (detections.confidences.at(i) < confidence_threshold || @@ -99,13 +96,13 @@ std::shared_ptr ObjectDetection::GetFrame(std::shared_ptr frame, i if (trackedObject_it != trackedObjects.end()) { std::shared_ptr trackedObject = std::static_pointer_cast(trackedObject_it->second); - if (trackedObject->Contains(frame_number) && trackedObject->visible.GetValue(frame_number) == 1) { + Clip* parentClip = (Clip*) trackedObject->ParentClip(); + if (parentClip && trackedObject->Contains(frame_number) && trackedObject->visible.GetValue(frame_number) == 1) { BBox trackedBox = trackedObject->GetBox(frame_number); - - QRectF boxRect((trackedBox.cx - trackedBox.width / 2) * fw, - (trackedBox.cy - trackedBox.height / 2) * fh, - trackedBox.width * fw, - trackedBox.height * fh); + QRectF boxRect((trackedBox.cx - trackedBox.width / 2) * frame_image->width(), + (trackedBox.cy - trackedBox.height / 2) * frame_image->height(), + trackedBox.width * frame_image->width(), + trackedBox.height * frame_image->height()); if (trackedObject->draw_box.GetValue(frame_number) == 1) { // Draw bounding box diff --git a/src/effects/Tracker.cpp b/src/effects/Tracker.cpp index 55709879..c4e023e8 100644 --- a/src/effects/Tracker.cpp +++ b/src/effects/Tracker.cpp @@ -135,29 +135,6 @@ std::shared_ptr Tracker::GetFrame(std::shared_ptr frame, int64_t f return frame; } -QRectF Tracker::scaleAndCenterRect(const QRectF& sourceRect, const QRectF& targetRect) { - float sourceAspectRatio = sourceRect.width() / sourceRect.height(); - float targetWidth = targetRect.width(); - float targetHeight = targetRect.height(); - float newWidth, newHeight; - - if (sourceAspectRatio > targetRect.width() / targetRect.height()) { - // Source is wider relative to target, so it's constrained by target's width - newWidth = targetWidth; - newHeight = newWidth / sourceAspectRatio; - } else { - // Source is taller relative to target, so it's constrained by target's height - newHeight = targetHeight; - newWidth = newHeight * sourceAspectRatio; - } - - // Center the new rectangle within the target rectangle - float newX = targetRect.left() + (targetWidth - newWidth) / 2.0; - float newY = targetRect.top() + (targetHeight - newHeight) / 2.0; - - return QRectF(newX, newY, newWidth, newHeight); -} - // Get the indexes and IDs of all visible objects in the given frame std::string Tracker::GetVisibleObjects(int64_t frame_number) const{ diff --git a/src/effects/Tracker.h b/src/effects/Tracker.h index c6955a84..d05b72a1 100644 --- a/src/effects/Tracker.h +++ b/src/effects/Tracker.h @@ -71,9 +71,6 @@ namespace openshot /// Get the indexes and IDs of all visible objects in the given frame std::string GetVisibleObjects(int64_t frame_number) const override; - /// Find a rectangle inside another (centered) - static QRectF scaleAndCenterRect(const QRectF& sourceRect, const QRectF& targetRect); - // Get and Set JSON methods /// Generate JSON string of this object