OrangePi3588Media/tests/test_color_analyzer.cpp

82 lines
2.4 KiB
C++

#include <gtest/gtest.h>
#include <cstdint>
#include <memory>
#include <vector>
#include "frame/frame.h"
#include "../plugins/logic_gate/color_analyzer.h"
namespace rk3588 {
namespace {
Frame MakeRgbFrame(int width, int height, uint8_t top_value, uint8_t middle_value, uint8_t bottom_value) {
auto pixels = std::make_shared<std::vector<uint8_t>>(static_cast<size_t>(width * height * 3), 0);
for (int y = 0; y < height; ++y) {
uint8_t value = bottom_value;
if (y < (height * 35 / 100)) {
value = top_value;
} else if (y < (height * 75 / 100)) {
value = middle_value;
}
for (int x = 0; x < width; ++x) {
const size_t idx = static_cast<size_t>((y * width + x) * 3);
(*pixels)[idx] = value;
(*pixels)[idx + 1] = value;
(*pixels)[idx + 2] = value;
}
}
Frame frame;
frame.width = width;
frame.height = height;
frame.format = PixelFormat::RGB;
frame.stride = width * 3;
frame.data = pixels->data();
frame.data_size = pixels->size();
frame.data_owner = pixels;
return frame;
}
TEST(ColorAnalyzerTest, UsesMiddleLowerRegionForBrightness) {
ColorConfig config;
config.method = ColorMethod::RGB;
config.dark_threshold = 80;
config.roi_expand = 1.0f;
config.debug_output = false;
ColorAnalyzer analyzer(config);
Frame frame = MakeRgbFrame(10, 10, 180, 20, 200);
Rect bbox{0.0f, 0.0f, 10.0f, 10.0f};
const ColorResult result = analyzer.Analyze(frame, bbox);
ASSERT_TRUE(result.valid);
EXPECT_TRUE(result.is_dark);
EXPECT_LT(result.brightness, static_cast<float>(config.dark_threshold));
EXPECT_GT(result.dark_ratio, result.light_ratio);
EXPECT_GT(result.dark_ratio, result.mid_ratio);
}
TEST(ColorAnalyzerTest, ClassifiesLightDominatedSampleAsNonDark) {
ColorConfig config;
config.method = ColorMethod::RGB;
config.dark_threshold = 80;
config.roi_expand = 1.0f;
config.debug_output = false;
ColorAnalyzer analyzer(config);
Frame frame = MakeRgbFrame(10, 10, 30, 210, 220);
Rect bbox{0.0f, 0.0f, 10.0f, 10.0f};
const ColorResult result = analyzer.Analyze(frame, bbox);
ASSERT_TRUE(result.valid);
EXPECT_FALSE(result.is_dark);
EXPECT_GT(result.light_ratio, result.dark_ratio);
EXPECT_GT(result.light_ratio, result.mid_ratio);
}
} // namespace
} // namespace rk3588