Add helper classes to more easily handle video condition parameters

This commit is contained in:
WarmUpTill
2022-12-16 23:45:42 +01:00
committed by WarmUpTill
parent feab4fe744
commit b7c6deddde
3 changed files with 167 additions and 0 deletions

View File

@@ -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

View File

@@ -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;
}

View File

@@ -0,0 +1,53 @@
#pragma once
#include "opencv-helpers.hpp"
#include "area-selection.hpp"
#include <obs.hpp>
#include <obs-module.h>
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};
};