From c8c5bd45eb930995dd22b0da21f86313bbc0f07e Mon Sep 17 00:00:00 2001 From: Jared Bruni Date: Fri, 15 Mar 2024 00:31:57 -0700 Subject: [PATCH] morphological --- glitch.gui/filters/layer_filter.cpp | 3 +++ glitch.gui/filters/layer_filter.hpp | 30 +++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/glitch.gui/filters/layer_filter.cpp b/glitch.gui/filters/layer_filter.cpp index ebbb50e..5e85bff 100644 --- a/glitch.gui/filters/layer_filter.cpp +++ b/glitch.gui/filters/layer_filter.cpp @@ -381,6 +381,9 @@ void add_layer_filters(Layer &layer1, Layer &layer2, Layer &layer3) { MirrorBallEffect *mirror_b = new MirrorBallEffect(); new_filter_list.push_back({"New_MirrorBall", mirror_b}); + + MorphologicalWarpEffect *warp_e = new MorphologicalWarpEffect(); + new_filter_list.push_back({"New_MorphologicalWarp", warp_e}); RGB_Real_Increase *r_real = new RGB_Real_Increase(); new_filter_list.push_back({"New_Real_Inc", r_real}); diff --git a/glitch.gui/filters/layer_filter.hpp b/glitch.gui/filters/layer_filter.hpp index 85db9a0..f2c3439 100644 --- a/glitch.gui/filters/layer_filter.hpp +++ b/glitch.gui/filters/layer_filter.hpp @@ -3119,6 +3119,36 @@ private: } }; +class MorphologicalWarpEffect : public FilterFunc { +public: + MorphologicalWarpEffect() {} + void init() override { + warp.initValues(5, 1, 5, 50); + } + void proc(cv::Mat &frame) override { + if (!frame.empty()) { + applyMorphologicalWarp(frame); + } + } + void clear() override {} + +private: + void applyMorphologicalWarp(cv::Mat &frame) { + cv::Mat warped; + int morph_size = warp.nextValue(); + cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE, + cv::Size(2 * morph_size + 1, 2 * morph_size + 1), + cv::Point(morph_size, morph_size)); + cv::erode(frame, warped, element); + cv::dilate(warped, warped, element); + double alpha = 0.5; + cv::addWeighted(frame, alpha, warped, 1 - alpha, 0.0, frame); + } + + KnobT warp; + +}; + void add_layer_filters(Layer&,Layer&,Layer&);