123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- // STL includes
- #include <cassert>
- #include <random>
- #include <iostream>
- // Utils includes
- #include <utils/Image.h>
- #include <utils/ColorRgb.h>
- // Blackborder includes
- #include "blackborder/BlackBorderProcessor.h"
- using namespace hyperion;
- ColorRgb randomColor()
- {
- const uint8_t randomRedValue = uint8_t(rand() % (std::numeric_limits<uint8_t>::max() + 1));
- const uint8_t randomGreenValue = uint8_t(rand() % (std::numeric_limits<uint8_t>::max() + 1));
- const uint8_t randomBlueValue = uint8_t(rand() % (std::numeric_limits<uint8_t>::max() + 1));
- return {randomRedValue, randomGreenValue, randomBlueValue};
- }
- Image<ColorRgb> createImage(unsigned width, unsigned height, unsigned topBorder, unsigned leftBorder)
- {
- Image<ColorRgb> image(width, height);
- for (unsigned x=0; x<image.width(); ++x)
- {
- for (unsigned y=0; y<image.height(); ++y)
- {
- if (y < topBorder || y > ( height - topBorder ) || x < leftBorder || x > (width - leftBorder) )
- {
- image(x,y) = ColorRgb::BLACK;
- }
- else
- {
- image(x,y) = randomColor();
- }
- }
- }
- return image;
- }
- int main()
- {
- // unsigned unknownCnt = 600;
- unsigned borderCnt = 50;
- // unsigned blurCnt = 0;
- QJsonObject config;
- // BlackBorderProcessor processor(unknownCnt, borderCnt, blurCnt, 3, config);
- BlackBorderProcessor processor(config);
- // Start with 'no border' detection
- Image<ColorRgb> noBorderImage = createImage(64, 64, 0, 0);
- for (unsigned i=0; i<10; ++i)
- {
- bool newBorder = processor.process(noBorderImage);
- if (i == 0)
- {
- // Switch to 'no border' should immediate
- if (!newBorder)
- {
- std::cerr << "Failed to detect 'no border' when required" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- if (newBorder)
- {
- std::cerr << "Incorrectly detected new border, when there in none" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- }
- // Verify that the border is indeed
- if (processor.getCurrentBorder().unknown != false || processor.getCurrentBorder().horizontalSize != 0 || processor.getCurrentBorder().verticalSize != 0)
- {
- std::cerr << "Incorrectlty identified 'no border'" << std::endl;
- exit(EXIT_FAILURE);
- }
- int borderSize = 12;
- Image<ColorRgb> horzImage = createImage(64, 64, borderSize, 0);
- for (unsigned i=0; i<borderCnt*2; ++i)
- {
- bool newBorder = processor.process(horzImage);
- if (i == borderCnt+10)// 10 frames till new border gets a chance to proof consistency
- {
- if (!newBorder)
- {
- std::cerr << "Failed to detect 'horizontal border' when required after " << borderCnt << " images" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- if (newBorder)
- {
- std::cerr << "Incorrectly detected new border, when there in none" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- }
- if (processor.getCurrentBorder().unknown != false || processor.getCurrentBorder().horizontalSize != borderSize || processor.getCurrentBorder().verticalSize != 0)
- {
- std::cerr << "Incorrectlty found 'horizontal border' (" << processor.getCurrentBorder().unknown << "," << processor.getCurrentBorder().horizontalSize << "," << processor.getCurrentBorder().verticalSize << ")" << std::endl;
- exit(EXIT_FAILURE);
- }
- for (unsigned i=0; i<borderCnt*2; ++i)
- {
- bool newBorder = processor.process(noBorderImage);
- if (i == borderCnt+10)// 10 frames till new border gets a chance to proof consistency
- {
- if (!newBorder)
- {
- std::cerr << "Failed to detect 'no border' when required after " << borderCnt << " images" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- if (newBorder)
- {
- std::cerr << "Incorrectly detected no border, when there in none" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- }
- // Check switch back to no border
- if ( (processor.getCurrentBorder().unknown != false || processor.getCurrentBorder().horizontalSize != 0 || processor.getCurrentBorder().verticalSize != 0))
- {
- std::cerr << "Failed to switch back to 'no border'" << std::endl;
- exit(EXIT_FAILURE);
- }
- Image<ColorRgb> vertImage = createImage(64, 64, 0, borderSize);
- for (unsigned i=0; i<borderCnt*2; ++i)
- {
- bool newBorder = processor.process(vertImage);
- if (i == borderCnt+10)// 10 frames till new border gets a chance to proof consistency
- {
- if (!newBorder)
- {
- std::cerr << "Failed to detect 'vertical border' when required after " << borderCnt << " images" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- else
- {
- if (newBorder)
- {
- std::cerr << "Incorrectly detected new border, when there in none" << std::endl;
- exit(EXIT_FAILURE);
- }
- }
- }
- if (processor.getCurrentBorder().unknown != false || processor.getCurrentBorder().horizontalSize != 0 || processor.getCurrentBorder().verticalSize != borderSize)
- {
- std::cerr << "Incorrectlty found 'vertical border'" << std::endl;
- exit(EXIT_FAILURE);
- }
- // Switch back (in one shot) to no border
- // assert(processor.process(noBorderImage));
- // assert(processor.getCurrentBorder().verticalSize == 0 && processor.getCurrentBorder().horizontalSize == 0);
- return 0;
- }
|