feat: Add configurable color algorithm (mean, mean_sqrt, max)

This commit is contained in:
Tobias J. Endres 2025-08-16 06:25:40 +02:00
parent 768b3b17b5
commit 45a831f317
3 changed files with 33 additions and 4 deletions

View File

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

View File

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

View File

@ -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"));