From 6ee94409dccc225d21977484c0613a0082bdd7cc Mon Sep 17 00:00:00 2001 From: "T. van der Zwan" Date: Fri, 23 Aug 2013 05:09:09 +0000 Subject: [PATCH] Added blackborder detection and processing to the image processor --- include/hyperion/ImageProcessor.h | 14 +++++++-- libsrc/hyperion/ImageProcessor.cpp | 49 ++++++++++++++++++++++++++++-- 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/include/hyperion/ImageProcessor.h b/include/hyperion/ImageProcessor.h index 3999b053..18747afe 100644 --- a/include/hyperion/ImageProcessor.h +++ b/include/hyperion/ImageProcessor.h @@ -4,11 +4,15 @@ // Utils includes #include -#include +// Hyperion includes #include +#include // Forward class declaration -namespace hyperion { class ImageToLedsMap; } +namespace hyperion { + class ImageToLedsMap; + class BlackBorderProcessor; +} /** * The ImageProcessor translates an RGB-image to RGB-values for the leds. The processing is @@ -52,9 +56,15 @@ private: ImageProcessor(const LedString &ledString); + void verifyBorder(const RgbImage& image); private: const LedString mLedString; + bool _enableBlackBorderRemoval; + + /// The processor for black border detection + hyperion::BlackBorderProcessor* _borderProcessor; + hyperion::ImageToLedsMap* mImageToLeds; }; diff --git a/libsrc/hyperion/ImageProcessor.cpp b/libsrc/hyperion/ImageProcessor.cpp index 781fd4be..172fa024 100644 --- a/libsrc/hyperion/ImageProcessor.cpp +++ b/libsrc/hyperion/ImageProcessor.cpp @@ -1,13 +1,18 @@ + +// Hyperion includes #include - -#include "ImageToLedsMap.h" +// Local-Hyperion includes +#include "BlackBorderProcessor.h" #include "ColorTransform.h" +#include "ImageToLedsMap.h" using namespace hyperion; ImageProcessor::ImageProcessor(const LedString& ledString) : mLedString(ledString), + _enableBlackBorderRemoval(true), + _borderProcessor(new BlackBorderProcessor(600, 50, 1)), mImageToLeds(nullptr) { // empty @@ -16,6 +21,7 @@ ImageProcessor::ImageProcessor(const LedString& ledString) : ImageProcessor::~ImageProcessor() { delete mImageToLeds; + delete _borderProcessor; } void ImageProcessor::setSize(const unsigned width, const unsigned height) @@ -38,6 +44,9 @@ std::vector ImageProcessor::process(const RgbImage& image) // Ensure that the buffer-image is the proper size setSize(image.width(), image.height()); + // Check black border detection + verifyBorder(image); + // Create a result vector and call the 'in place' functionl std::vector colors = mImageToLeds->getMeanLedColor(image); @@ -47,6 +56,42 @@ std::vector ImageProcessor::process(const RgbImage& image) void ImageProcessor::process(const RgbImage& image, std::vector& ledColors) { + // Check black border detection + verifyBorder(image); + // Determine the mean-colors of each led (using the existing mapping) mImageToLeds->getMeanLedColor(image, ledColors); } + +void ImageProcessor::verifyBorder(const RgbImage& image) +{ + if(_enableBlackBorderRemoval && _borderProcessor->process(image)) + { + std::cout << "BORDER SWITCH REQUIRED!!" << std::endl; + + const BlackBorder border = _borderProcessor->getCurrentBorder(); + + // Clean up the old mapping + delete mImageToLeds; + + switch (border.type) + { + case BlackBorder::none: + case BlackBorder::unknown: + // Construct a new buffer and mapping + mImageToLeds = new ImageToLedsMap(image.width(), image.height(), 0, 0, mLedString.leds()); + break; + case BlackBorder::horizontal: + // Construct a new buffer and mapping + mImageToLeds = new ImageToLedsMap(image.width(), image.height(), border.size, 0, mLedString.leds()); + break; + case BlackBorder::vertical: + // Construct a new buffer and mapping + mImageToLeds = new ImageToLedsMap(image.width(), image.height(), 0, border.size, mLedString.leds()); + break; + } + + std::cout << "CURRENT BORDER TYPE: " << _borderProcessor->getCurrentBorder().type << " (size=" << _borderProcessor->getCurrentBorder().size << ")" << std::endl; + } + +}