diff --git a/src/macro-external/opencv/CMakeLists.txt b/src/macro-external/opencv/CMakeLists.txt index 88e717cd..0a6faa54 100644 --- a/src/macro-external/opencv/CMakeLists.txt +++ b/src/macro-external/opencv/CMakeLists.txt @@ -23,6 +23,8 @@ target_sources( macro-condition-video.hpp opencv-helpers.cpp opencv-helpers.hpp + paramerter-wrappers.cpp + paramerter-wrappers.hpp preview-dialog.cpp preview-dialog.hpp threshold-slider.cpp diff --git a/src/macro-external/opencv/paramerter-wrappers.cpp b/src/macro-external/opencv/paramerter-wrappers.cpp new file mode 100644 index 00000000..81e310b9 --- /dev/null +++ b/src/macro-external/opencv/paramerter-wrappers.cpp @@ -0,0 +1,112 @@ +#include "paramerter-wrappers.hpp" + +bool PatternMatchParameters::Save(obs_data_t *obj) const +{ + auto data = obs_data_create(); + obs_data_set_bool(data, "useForChangedCheck", useForChangedCheck); + obs_data_set_double(data, "threshold", threshold); + obs_data_set_bool(data, "useAlphaAsMask", useAlphaAsMask); + obs_data_set_obj(obj, "patternMatchData", data); + obs_data_release(data); + return true; +} + +bool PatternMatchParameters::Load(obs_data_t *obj) +{ + // TODO: Remove this fallback in a future version + if (!obs_data_has_user_value(obj, "patternMatchData")) { + useForChangedCheck = + obs_data_get_bool(obj, "usePatternForChangedCheck"); + threshold = obs_data_get_double(obj, "threshold"); + useAlphaAsMask = obs_data_get_bool(obj, "useAlphaAsMask"); + return true; + } + auto data = obs_data_get_obj(obj, "patternMatchData"); + useForChangedCheck = obs_data_get_bool(data, "useForChangedCheck"); + threshold = obs_data_get_double(data, "threshold"); + useAlphaAsMask = obs_data_get_bool(data, "useAlphaAsMask"); + obs_data_release(data); + return true; +} + +bool ObjDetectParamerts::Save(obs_data_t *obj) const +{ + auto data = obs_data_create(); + obs_data_set_string(data, "modelPath", modelPath.c_str()); + obs_data_set_double(data, "scaleFactor", scaleFactor); + obs_data_set_int(data, "minNeighbors", minNeighbors); + minSize.Save(data, "minSize"); + maxSize.Save(data, "maxSize"); + obs_data_set_obj(obj, "objectMatchData", data); + obs_data_release(data); + return true; +} + +bool isScaleFactorValid(double scaleFactor) +{ + return scaleFactor > 1.; +} + +bool isMinNeighborsValid(int minNeighbors) +{ + return minNeighbors >= minMinNeighbors && + minNeighbors <= maxMinNeighbors; +} + +bool ObjDetectParamerts::Load(obs_data_t *obj) +{ + // TODO: Remove this fallback in a future version + if (!obs_data_has_user_value(obj, "patternMatchData")) { + modelPath = obs_data_get_string(obj, "modelDataPath"); + scaleFactor = obs_data_get_double(obj, "scaleFactor"); + if (!isScaleFactorValid(scaleFactor)) { + scaleFactor = 1.1; + } + minNeighbors = obs_data_get_int(obj, "minNeighbors"); + if (!isMinNeighborsValid(minNeighbors)) { + minNeighbors = minMinNeighbors; + } + minSize.Load(obj, "minSize"); + maxSize.Load(obj, "maxSize"); + return true; + } + auto data = obs_data_get_obj(obj, "objectMatchData"); + modelPath = obs_data_get_string(data, "modelPath"); + scaleFactor = obs_data_get_double(data, "scaleFactor"); + if (!isScaleFactorValid(scaleFactor)) { + scaleFactor = 1.1; + } + minNeighbors = obs_data_get_int(data, "minNeighbors"); + if (!isMinNeighborsValid(minNeighbors)) { + minNeighbors = minMinNeighbors; + } + minSize.Load(data, "minSize"); + maxSize.Load(data, "maxSize"); + obs_data_release(data); + return true; +} + +bool AreaParamters::Save(obs_data_t *obj) const +{ + auto data = obs_data_create(); + obs_data_set_bool(data, "enabled", enable); + area.Save(data, "area"); + obs_data_set_obj(obj, "areaData", data); + obs_data_release(data); + return true; +} + +bool AreaParamters::Load(obs_data_t *obj) +{ + // TODO: Remove this fallback in a future version + if (!obs_data_has_user_value(obj, "areaData")) { + enable = obs_data_get_bool(obj, "checkAreaEnabled"); + area.Load(obj, "checkArea"); + return true; + } + auto data = obs_data_get_obj(obj, "areaData"); + enable = obs_data_get_bool(data, "enabled"); + area.Load(data, "area"); + obs_data_release(data); + return true; +} diff --git a/src/macro-external/opencv/paramerter-wrappers.hpp b/src/macro-external/opencv/paramerter-wrappers.hpp new file mode 100644 index 00000000..8de0d555 --- /dev/null +++ b/src/macro-external/opencv/paramerter-wrappers.hpp @@ -0,0 +1,53 @@ +#pragma once +#include "opencv-helpers.hpp" +#include "area-selection.hpp" + +#include +#include + +enum class VideoCondition { + MATCH, + DIFFER, + HAS_NOT_CHANGED, + HAS_CHANGED, + NO_IMAGE, + PATTERN, + OBJECT, + BRIGHTNESS, +}; + +class PatternMatchParameters { +public: + bool Save(obs_data_t *obj) const; + bool Load(obs_data_t *obj); + + QImage image; + bool useForChangedCheck = false; + bool useAlphaAsMask = false; + double threshold = 0.8; +}; + +class ObjDetectParamerts { +public: + bool Save(obs_data_t *obj) const; + bool Load(obs_data_t *obj); + + std::string modelPath = + obs_get_module_data_path(obs_current_module()) + + std::string( + "/res/cascadeClassifiers/haarcascade_frontalface_alt.xml"); + cv::CascadeClassifier cascade; + double scaleFactor = defaultScaleFactor; + int minNeighbors = minMinNeighbors; + advss::Size minSize{0, 0}; + advss::Size maxSize{0, 0}; +}; + +class AreaParamters { +public: + bool Save(obs_data_t *obj) const; + bool Load(obs_data_t *obj); + + bool enable = false; + advss::Area area{0, 0, 0, 0}; +};