SceneSwitcher/src/external-macro-modules/opencv/area-selection.cpp
WarmUpTill 5462334693 Add option to perform video check only on parts of the video source
This will significantly reduce CPU usage if the video source larger than
the selected area and make it easier to only check parts of a video
source output image.
2022-03-15 10:58:29 -07:00

131 lines
3.2 KiB
C++

#include "area-selection.hpp"
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QLabel>
#include <obs-module.h>
void advss::Size::Save(obs_data_t *obj, const char *name)
{
auto data = obs_data_create();
obs_data_set_int(data, "width", width);
obs_data_set_int(data, "height", height);
obs_data_set_obj(obj, name, data);
obs_data_release(data);
}
void advss::Size::Load(obs_data_t *obj, const char *name)
{
auto data = obs_data_get_obj(obj, name);
width = obs_data_get_int(data, "width");
height = obs_data_get_int(data, "height");
obs_data_release(data);
}
cv::Size advss::Size::CV()
{
return {width, height};
}
void advss::Area::Save(obs_data_t *obj, const char *name)
{
auto data = obs_data_create();
obs_data_set_int(data, "x", x);
obs_data_set_int(data, "y", y);
obs_data_set_int(data, "width", width);
obs_data_set_int(data, "height", height);
obs_data_set_obj(obj, name, data);
obs_data_release(data);
}
void advss::Area::Load(obs_data_t *obj, const char *name)
{
auto data = obs_data_get_obj(obj, name);
x = obs_data_get_int(data, "x");
y = obs_data_get_int(data, "y");
width = obs_data_get_int(data, "width");
height = obs_data_get_int(data, "height");
obs_data_release(data);
}
SizeSelection::SizeSelection(int min, int max, QWidget *parent)
: _x(new QSpinBox), _y(new QSpinBox), QWidget(parent)
{
_x->setMinimum(min);
_y->setMinimum(min);
_x->setMaximum(max);
_y->setMaximum(max);
connect(_x, SIGNAL(valueChanged(int)), this, SLOT(XChanged(int)));
connect(_y, SIGNAL(valueChanged(int)), this, SLOT(YChanged(int)));
auto layout = new QHBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(_x);
layout->addWidget(new QLabel(" x "));
layout->addWidget(_y);
setLayout(layout);
}
void SizeSelection::SetSize(const advss::Size &s)
{
_x->setValue(s.width);
_y->setValue(s.height);
}
advss::Size SizeSelection::Size()
{
return advss::Size{_x->value(), _y->value()};
}
void SizeSelection::XChanged(int value)
{
emit SizeChanged(advss::Size{value, _y->value()});
}
void SizeSelection::YChanged(int value)
{
emit SizeChanged(advss::Size{_x->value(), value});
}
AreaSelection::AreaSelection(int min, int max, QWidget *parent)
: _x(new SizeSelection(min, max)),
_y(new SizeSelection(min, max)),
QWidget(parent)
{
_x->_x->setToolTip("X");
_x->_y->setToolTip("Y");
_y->_x->setToolTip(
obs_module_text("AdvSceneSwitcher.condition.video.width"));
_y->_y->setToolTip(
obs_module_text("AdvSceneSwitcher.condition.video.height"));
connect(_x, SIGNAL(SizeChanged(advss::Size)), this,
SLOT(XSizeChanged(advss::Size)));
connect(_y, SIGNAL(SizeChanged(advss::Size)), this,
SLOT(YSizeChanged(advss::Size)));
auto layout = new QVBoxLayout();
layout->setContentsMargins(0, 0, 0, 0);
layout->addWidget(_x);
layout->addWidget(_y);
setLayout(layout);
}
void AreaSelection::SetArea(const advss::Area &value)
{
_x->SetSize({value.x, value.y});
_y->SetSize({value.width, value.height});
}
void AreaSelection::XSizeChanged(advss::Size value)
{
emit AreaChanged(advss::Area{value.width, value.height,
_y->Size().width, _y->Size().height});
}
void AreaSelection::YSizeChanged(advss::Size value)
{
emit AreaChanged(advss::Area{_x->Size().width, _x->Size().height,
value.width, value.height});
}