Added zoom to Stabilizer Effect

This commit is contained in:
Brenno
2020-07-22 14:05:19 -03:00
parent 6d6c156415
commit e69f7b8f12
6 changed files with 39 additions and 11 deletions

View File

@@ -90,6 +90,7 @@ namespace openshot
/// Init effect settings
void init_effect_details();
std::string protobuf_data_path;
Keyframe zoom;
public:
std::string teste;

View File

@@ -51,7 +51,7 @@ void CVStabilization::stabilizeClip(openshot::Clip& video, size_t _start, size_t
}
// Extract and track opticalflow features for each frame
for (frame_number = start; frame_number < end; frame_number++)
for (frame_number = start; frame_number <= end; frame_number++)
{
// Stop the feature tracker process
if(processingController->ShouldStop()){
@@ -67,7 +67,7 @@ void CVStabilization::stabilizeClip(openshot::Clip& video, size_t _start, size_t
TrackFrameFeatures(cvimage, frame_number);
// Update progress
processingController->SetProgress(uint(100*frame_number/end));
processingController->SetProgress(uint(100*(frame_number-start)/(end-start)));
}
// Calculate trajectory data

View File

@@ -77,7 +77,7 @@ void CVTracker::trackClip(openshot::Clip& video, size_t _start, size_t _end, boo
}
// Loop through video
for (frame = start; frame < end; frame++)
for (frame = start; frame <= end; frame++)
{
// Stop the feature tracker process
@@ -110,7 +110,7 @@ void CVTracker::trackClip(openshot::Clip& video, size_t _start, size_t _end, boo
}
// Update progress
processingController->SetProgress(uint(100*frame_number/end));
processingController->SetProgress(uint(100*(frame_number-start)/(end-start)));
}
}

View File

@@ -63,7 +63,7 @@ void Stabilizer::init_effect_details()
info.has_audio = false;
info.has_video = true;
protobuf_data_path = "";
zoom = 1.0;
}
// This method is required for all derived classes of EffectBase, and returns a
@@ -79,6 +79,8 @@ std::shared_ptr<Frame> Stabilizer::GetFrame(std::shared_ptr<Frame> frame, int64_
// Check if track data exists for the requested frame
if(transformationData.find(frame_number) != transformationData.end()){
float zoom_value = zoom.GetValue(frame_number);
// Create empty rotation matrix
cv::Mat T(2,3,CV_64F);
@@ -97,7 +99,7 @@ std::shared_ptr<Frame> Stabilizer::GetFrame(std::shared_ptr<Frame> frame, int64_
cv::warpAffine(frame_image, frame_stabilized, T, frame_image.size());
// Scale up the image to remove black borders
cv::Mat T_scale = cv::getRotationMatrix2D(cv::Point2f(frame_stabilized.cols/2, frame_stabilized.rows/2), 0, 1.04);
cv::Mat T_scale = cv::getRotationMatrix2D(cv::Point2f(frame_stabilized.cols/2, frame_stabilized.rows/2), 0, zoom_value);
cv::warpAffine(frame_stabilized, frame_stabilized, T_scale, frame_stabilized.size());
frame_image = frame_stabilized;
}
@@ -178,6 +180,7 @@ Json::Value Stabilizer::JsonValue() const {
Json::Value root = EffectBase::JsonValue(); // get parent properties
root["type"] = info.class_name;
root["protobuf_data_path"] = protobuf_data_path;
root["zoom"] = zoom.JsonValue();
// return JsonValue
return root;
@@ -215,6 +218,8 @@ void Stabilizer::SetJsonValue(const Json::Value root) {
protobuf_data_path = "";
}
}
if(!root["zoom"].isNull())
zoom.SetJsonValue(root["zoom"]);
}
// Get all properties for a specific frame
@@ -229,6 +234,8 @@ std::string Stabilizer::PropertiesJSON(int64_t requested_frame) const {
root["end"] = add_property_json("End", End(), "float", "", NULL, 0, 1000 * 60 * 30, false, requested_frame);
root["duration"] = add_property_json("Duration", Duration(), "float", "", NULL, 0, 1000 * 60 * 30, true, requested_frame);
root["zoom"] = add_property_json("Zoom", zoom.GetValue(requested_frame), "float", "", &zoom, 0.0, 2.0, false, requested_frame);
// Return formatted string
return root.toStyledString();
}

View File

@@ -71,6 +71,16 @@ void displayClip(openshot::Clip &r9){
cv::destroyAllWindows();
}
/*
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
The following methods are just for getting JSON info to the pre-processing effects
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/
// Return JSON string for the tracker effect
string trackerJson(cv::Rect2d r, bool onlyProtoPath){
// Set the tracker
@@ -108,6 +118,16 @@ string stabilizerJson(bool onlyProtoPath){
return "{" + protobuf_data_path + ", " + smoothing_window.str() + "}";
}
string objectDetectionJson(bool onlyProtoPath){
// Construct all the composition of the JSON string
string protobuf_data_path = "\"protobuf_data_path\": \"example_object_detection.data\"";
// Return only the the protobuf path in JSON format
if(onlyProtoPath)
return "{" + protobuf_data_path + "}";
}
int main(int argc, char* argv[]) {
// Set pre-processing effects

View File

@@ -55,10 +55,10 @@ SUITE(CVStabilizer_Tests)
c1.Open();
// Create stabilizer
CVStabilization stabilizer("{\"protobuf_data_path\": \"stabilizer.data\"}", processingController);
CVStabilization stabilizer("{\"protobuf_data_path\": \"stabilizer.data\", \"smoothing_window\": 30}", processingController);
// Stabilize clip for frames 0-20
stabilizer.stabilizeClip(c1, 0, 20+1, true);
// Stabilize clip for frames 0-21
stabilizer.stabilizeClip(c1, 0, 21, true);
// Get stabilized data
TransformParam tp = stabilizer.GetTransformParamData(20);
@@ -93,7 +93,7 @@ SUITE(CVStabilizer_Tests)
c1.Open();
// Create first stabilizer
CVStabilization stabilizer_1("{\"protobuf_data_path\": \"stabilizer.data\"}", processingController);
CVStabilization stabilizer_1("{\"protobuf_data_path\": \"stabilizer.data\", \"smoothing_window\": 30}", processingController);
// Stabilize clip for frames 0-20
stabilizer_1.stabilizeClip(c1, 0, 20+1, true);
@@ -106,7 +106,7 @@ SUITE(CVStabilizer_Tests)
stabilizer_1.SaveStabilizedData();
// Create second stabilizer
CVStabilization stabilizer_2("{\"protobuf_data_path\": \"stabilizer.data\"}", processingController);
CVStabilization stabilizer_2("{\"protobuf_data_path\": \"stabilizer.data\", \"smoothing_window\": 30}", processingController);
// Load stabilized data from first stabilizer protobuf data
stabilizer_2.LoadStabilizedData();