feat: Add configurable color algorithm (mean, mean_sqrt, max)
This commit is contained in:
parent
768b3b17b5
commit
45a831f317
@ -6,9 +6,10 @@ HyperionProcessor::HyperionProcessor(const LedLayout &layout, const QJsonObject
|
||||
: QObject(parent),
|
||||
_layout(layout),
|
||||
_config(config),
|
||||
_borderDetector(config.value("blackBorderThreshold").toDouble(0.1)),
|
||||
_borderDetector(config.value("blackborderdetector").toObject()),
|
||||
_lastImageSize(0, 0),
|
||||
_colorSmoother(config.value("smoothingFactor").toDouble(0.1)) // Initialize color smoother
|
||||
_colorSmoother(config.value("smoothing").toObject()),
|
||||
_colorAlgorithm(config.value("colorAlgorithm").toString("mean_sqrt")) // Default to mean_sqrt
|
||||
{
|
||||
}
|
||||
|
||||
@ -152,8 +153,16 @@ QVector<QColor> HyperionProcessor::calculateLedColors(const QImage &image)
|
||||
ledColors.reserve(_ledMap.size());
|
||||
|
||||
for (const auto &pixelList : _ledMap) {
|
||||
// Use getMeanSqrtLedColor for more vibrant colors
|
||||
ledColors.append(getMeanSqrtLedColor(image, pixelList));
|
||||
if (_colorAlgorithm == "mean_sqrt") {
|
||||
ledColors.append(getMeanSqrtLedColor(image, pixelList));
|
||||
} else if (_colorAlgorithm == "mean") {
|
||||
ledColors.append(getAverageColor(image, pixelList));
|
||||
} else if (_colorAlgorithm == "max") {
|
||||
ledColors.append(getMaxColor(image, pixelList));
|
||||
} else {
|
||||
// Fallback to mean_sqrt if algorithm is unknown
|
||||
ledColors.append(getMeanSqrtLedColor(image, pixelList));
|
||||
}
|
||||
}
|
||||
|
||||
return ledColors;
|
||||
@ -194,3 +203,20 @@ QColor HyperionProcessor::getMeanSqrtLedColor(const QImage &image, const QVector
|
||||
static_cast<int>(qSqrt(static_cast<double>(g_sq / pixels.size()))),
|
||||
static_cast<int>(qSqrt(static_cast<double>(b_sq / pixels.size()))));
|
||||
}
|
||||
|
||||
QColor HyperionProcessor::getMaxColor(const QImage &image, const QVector<QPoint> &pixels) const
|
||||
{
|
||||
if (pixels.isEmpty()) {
|
||||
return Qt::black;
|
||||
}
|
||||
|
||||
int maxR = 0, maxG = 0, maxB = 0;
|
||||
for (const QPoint &pt : pixels) {
|
||||
QColor color = image.pixelColor(pt);
|
||||
if (color.red() > maxR) maxR = color.red();
|
||||
if (color.green() > maxG) maxG = color.green();
|
||||
if (color.blue() > maxB) maxB = color.blue();
|
||||
}
|
||||
|
||||
return QColor(maxR, maxG, maxB);
|
||||
}
|
||||
|
||||
@ -24,9 +24,11 @@ private:
|
||||
QVector<QColor> calculateLedColors(const QImage &image);
|
||||
QColor getAverageColor(const QImage &image, const QVector<QPoint> &pixels) const;
|
||||
QColor getMeanSqrtLedColor(const QImage &image, const QVector<QPoint> &pixels) const;
|
||||
QColor getMaxColor(const QImage &image, const QVector<QPoint> &pixels) const;
|
||||
|
||||
LedLayout _layout;
|
||||
QJsonObject _config;
|
||||
QString _colorAlgorithm;
|
||||
|
||||
BlackBorderDetector _borderDetector;
|
||||
BlackBorder _lastBorder;
|
||||
|
||||
1
main.cpp
1
main.cpp
@ -180,6 +180,7 @@ int main(int argc, char *argv[])
|
||||
QJsonObject processorConfig;
|
||||
processorConfig["blackborderdetector"] = blackBorderDetectorConfig;
|
||||
processorConfig["smoothing"] = smoothingConfig;
|
||||
processorConfig["colorAlgorithm"] = qgetenv("HYPERION_GRABBER_COLOR_ALGORITHM").isEmpty() ? QString("mean_sqrt") : QString(qgetenv("HYPERION_GRABBER_COLOR_ALGORITHM"));
|
||||
|
||||
QString wledColorOrder = qgetenv("HYPERION_GRABBER_WLED_COLOR_ORDER").isEmpty() ? QString("GRB") : QString(qgetenv("HYPERION_GRABBER_WLED_COLOR_ORDER"));
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user