222 lines
7.3 KiB
C++
222 lines
7.3 KiB
C++
#include <gtest/gtest.h>
|
||
#include "render/renderer.hpp"
|
||
#include <opencv2/opencv.hpp>
|
||
|
||
using namespace pipeline;
|
||
|
||
class RendererTest : public ::testing::Test {
|
||
protected:
|
||
void SetUp() override {
|
||
// 创建测试配置
|
||
config_.window_name = "Test Window";
|
||
config_.window_width = 800;
|
||
config_.window_height = 600;
|
||
config_.fullscreen = false;
|
||
config_.test_mode = true; // 启用测试模式
|
||
config_.enable = true; // 默认启用渲染
|
||
|
||
// 创建测试图像
|
||
test_frame_ = cv::Mat(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));
|
||
|
||
// 创建测试检测结果
|
||
renderer::DetectionResult det;
|
||
det.bbox = cv::Rect(100, 100, 200, 200);
|
||
det.confidence = 0.95f;
|
||
det.class_id = 1;
|
||
det.label = "person";
|
||
test_results_.push_back(det);
|
||
|
||
// 创建测试性能指标
|
||
metrics_.fps = 30.0f;
|
||
metrics_.inference_time_ms = 33.3f;
|
||
metrics_.gpu_usage_percent = 50.0f;
|
||
}
|
||
|
||
void TearDown() override {
|
||
renderer_.cleanup();
|
||
}
|
||
|
||
// 辅助函数:检查渲染结果
|
||
bool checkRenderedFrame(const cv::Mat& frame) {
|
||
if (frame.empty()) {
|
||
return false;
|
||
}
|
||
// 检查图像类型(应该始终是3通道)
|
||
if (frame.type() != CV_8UC3) {
|
||
return false;
|
||
}
|
||
// 检查图像是否有效
|
||
if (frame.cols <= 0 || frame.rows <= 0) {
|
||
return false;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
// 辅助函数:比较两个BGR图像是否相同
|
||
bool compareBGRImages(const cv::Mat& img1, const cv::Mat& img2) {
|
||
if (img1.size() != img2.size() || img1.type() != img2.type()) {
|
||
std::cout << "Image size or type mismatch" << std::endl;
|
||
std::cout << "img1: " << img1.size() << " type: " << img1.type() << std::endl;
|
||
std::cout << "img2: " << img2.size() << " type: " << img2.type() << std::endl;
|
||
return false;
|
||
}
|
||
cv::Mat diff;
|
||
cv::absdiff(img1, img2, diff);
|
||
std::vector<cv::Mat> channels;
|
||
cv::split(diff, channels);
|
||
|
||
// 检查每个通道的差异
|
||
for (size_t i = 0; i < channels.size(); ++i) {
|
||
int nonZero = cv::countNonZero(channels[i]);
|
||
if (nonZero > 0) {
|
||
std::cout << "Channel " << i << " has " << nonZero << " different pixels" << std::endl;
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
|
||
renderer::RendererConfig config_;
|
||
Renderer renderer_;
|
||
cv::Mat test_frame_;
|
||
std::vector<renderer::DetectionResult> test_results_;
|
||
PerformanceMetrics metrics_;
|
||
};
|
||
|
||
// 测试初始化
|
||
TEST_F(RendererTest, Initialization) {
|
||
EXPECT_TRUE(renderer_.init(config_));
|
||
// 重复初始化应该返回true
|
||
EXPECT_TRUE(renderer_.init(config_));
|
||
}
|
||
|
||
// 测试未初始化时的渲染
|
||
TEST_F(RendererTest, RenderWithoutInit) {
|
||
EXPECT_FALSE(renderer_.render(test_frame_, test_results_, metrics_));
|
||
}
|
||
|
||
// 测试正常渲染
|
||
TEST_F(RendererTest, NormalRendering) {
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
EXPECT_TRUE(renderer_.render(test_frame_, test_results_, metrics_));
|
||
EXPECT_TRUE(checkRenderedFrame(renderer_.getLastFrame()));
|
||
}
|
||
|
||
// 测试空检测结果的渲染
|
||
TEST_F(RendererTest, RenderEmptyResults) {
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
std::vector<renderer::DetectionResult> empty_results;
|
||
EXPECT_TRUE(renderer_.render(test_frame_, empty_results, metrics_));
|
||
}
|
||
|
||
// 测试清理
|
||
TEST_F(RendererTest, Cleanup) {
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
renderer_.cleanup();
|
||
// 清理后渲染应该失败
|
||
EXPECT_FALSE(renderer_.render(test_frame_, test_results_, metrics_));
|
||
}
|
||
|
||
// 测试不同尺寸的图像
|
||
TEST_F(RendererTest, DifferentImageSizes) {
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
|
||
// 测试不同尺寸的图像
|
||
std::vector<cv::Size> sizes = {
|
||
cv::Size(320, 240),
|
||
cv::Size(640, 480),
|
||
cv::Size(1280, 720),
|
||
cv::Size(1920, 1080)
|
||
};
|
||
|
||
for (const auto& size : sizes) {
|
||
cv::Mat frame(size, CV_8UC3, cv::Scalar(0, 0, 0));
|
||
EXPECT_TRUE(renderer_.render(frame, test_results_, metrics_))
|
||
<< "Failed to render frame of size " << size.width << "x" << size.height;
|
||
}
|
||
}
|
||
|
||
// 测试性能指标显示
|
||
TEST_F(RendererTest, MetricsDisplay) {
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
|
||
// 测试不同的性能指标值
|
||
std::vector<PerformanceMetrics> test_metrics = {
|
||
{30.0f, 33.3f, 50.0f},
|
||
{60.0f, 16.7f, 75.0f},
|
||
{120.0f, 8.3f, 90.0f}
|
||
};
|
||
|
||
for (const auto& metrics : test_metrics) {
|
||
EXPECT_TRUE(renderer_.render(test_frame_, test_results_, metrics))
|
||
<< "Failed to render with metrics: FPS=" << metrics.fps
|
||
<< ", Inference=" << metrics.inference_time_ms
|
||
<< "ms, GPU=" << metrics.gpu_usage_percent << "%";
|
||
}
|
||
}
|
||
|
||
// 测试边界情况
|
||
TEST_F(RendererTest, EdgeCases) {
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
|
||
// 测试空图像
|
||
cv::Mat empty_frame;
|
||
EXPECT_FALSE(renderer_.render(empty_frame, test_results_, metrics_));
|
||
|
||
// 测试灰度图像
|
||
cv::Mat gray_frame(480, 640, CV_8UC1, cv::Scalar(128));
|
||
EXPECT_TRUE(renderer_.render(gray_frame, test_results_, metrics_));
|
||
}
|
||
|
||
// 测试禁用渲染功能
|
||
TEST_F(RendererTest, DisabledRendering) {
|
||
// 禁用渲染
|
||
config_.enable = false;
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
|
||
// 创建一个有颜色的测试帧
|
||
cv::Mat colored_frame(480, 640, CV_8UC3, cv::Scalar(255, 0, 0)); // 蓝色帧
|
||
|
||
// 渲染应该成功,但不会绘制任何检测结果
|
||
EXPECT_TRUE(renderer_.render(colored_frame, test_results_, metrics_));
|
||
|
||
// 获取渲染后的帧
|
||
cv::Mat rendered_frame = renderer_.getLastFrame();
|
||
|
||
// 验证帧未被修改(没有绘制检测框和文本)
|
||
EXPECT_TRUE(!rendered_frame.empty());
|
||
EXPECT_EQ(rendered_frame.size(), colored_frame.size());
|
||
|
||
// 检查帧的内容是否与原始帧相同
|
||
EXPECT_TRUE(compareBGRImages(rendered_frame, colored_frame));
|
||
}
|
||
|
||
// 测试启用和禁用渲染的切换
|
||
TEST_F(RendererTest, ToggleRendering) {
|
||
// 创建一个有颜色的测试帧
|
||
cv::Mat colored_frame(480, 640, CV_8UC3, cv::Scalar(255, 0, 0)); // 蓝色帧
|
||
|
||
// 先启用渲染
|
||
config_.enable = true;
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
EXPECT_TRUE(renderer_.render(colored_frame, test_results_, metrics_));
|
||
cv::Mat rendered_frame_enabled = renderer_.getLastFrame();
|
||
|
||
// 验证检测结果被绘制(帧应该被修改)
|
||
EXPECT_FALSE(compareBGRImages(rendered_frame_enabled, colored_frame));
|
||
|
||
// 禁用渲染
|
||
renderer_.cleanup(); // 先清理现有的渲染器
|
||
config_.enable = false;
|
||
ASSERT_TRUE(renderer_.init(config_));
|
||
EXPECT_TRUE(renderer_.render(colored_frame, test_results_, metrics_));
|
||
cv::Mat rendered_frame_disabled = renderer_.getLastFrame();
|
||
|
||
// 验证帧未被修改
|
||
EXPECT_TRUE(compareBGRImages(rendered_frame_disabled, colored_frame));
|
||
}
|
||
|
||
int main(int argc, char **argv) {
|
||
testing::InitGoogleTest(&argc, argv);
|
||
return RUN_ALL_TESTS();
|
||
}
|