fix: redownload images matching each experiment theme; fix exp8 light bar detection (2/2 now)

This commit is contained in:
TuxMonkey
2026-07-27 17:57:50 +08:00
parent 6292c6378b
commit 362b4183d0
16 changed files with 213 additions and 94 deletions

View File

@@ -47,18 +47,15 @@ int main()
// 600×450 画布,深灰色背景(模拟比赛场地的昏暗环境)
cv::Mat scene(450, 600, CV_8UC3, cv::Scalar(40, 40, 40));
// 画两个"红色灯条"(模拟 RoboMaster 装甲板上的 LED)
// 灯条是竖直的细长矩形,这是我们检测的目标
// 左灯条
cv::rectangle(scene, cv::Point(200, 120), cv::Point(240, 280),
cv::Scalar(0, 0, 255), -1); // 纯红色竖直矩形
// 右灯条
cv::rectangle(scene, cv::Point(360, 120), cv::Point(400, 280),
cv::Scalar(0, 0, 255), -1); // 纯红色竖直矩形
// 画一个红色"装甲板"(连接两个灯条的中间横梁)
cv::rectangle(scene, cv::Point(200, 180), cv::Point(400, 220),
cv::Scalar(0, 0, 200), -1); // 稍暗一点的红色
// --- 先画背景噪点(必须在灯条之前!否则噪点会覆盖在灯条上)---
for (int i = 0; i < 200; i++)
{
int x = rand() % 600;
int y = rand() % 450;
uchar noise_color = static_cast<uchar>(rand() % 128 + 60);
cv::circle(scene, cv::Point(x, y), 1,
cv::Scalar(noise_color, noise_color, noise_color), -1);
}
// 画一些干扰物(场地上可能有其他颜色的物体)
cv::circle(scene, cv::Point(100, 100), 30, cv::Scalar(255, 0, 0), -1); // 蓝色干扰圆
@@ -66,16 +63,20 @@ int main()
cv::Scalar(0, 255, 0), -1); // 绿色干扰矩形
cv::circle(scene, cv::Point(80, 350), 40, cv::Scalar(0, 255, 255), -1); // 黄色干扰圆
// 撒一些随机噪点(模拟摄像头传感器噪点)
for (int i = 0; i < 200; i++)
{
int x = rand() % 600;
int y = rand() % 450;
// 随机颜色(模拟 CCD/CMOS 噪点)
uchar noise_color = static_cast<uchar>(rand() % 128 + 60);
cv::circle(scene, cv::Point(x, y), 1,
cv::Scalar(noise_color, noise_color, noise_color), -1);
}
// 画装甲板的中间横梁(深灰色,不会被 inRange 误检为红色)
// 注意:横梁必须在灯条之前画!这样红色灯条覆盖在横梁上方,
// 保证灯条从顶到底都是纯红色,不被横梁切断
cv::rectangle(scene, cv::Point(200, 180), cv::Point(400, 220),
cv::Scalar(80, 80, 80), -1); // 深灰色横梁
// 在上面画红色灯条(最后画,确保不被其他元素覆盖)
// 灯条是竖直的细长矩形,模拟 RoboMaster 装甲板侧面的 LED 灯条
// 左灯条
cv::rectangle(scene, cv::Point(200, 120), cv::Point(240, 280),
cv::Scalar(0, 0, 255), -1); // 纯红色竖直矩形 (B=0,G=0,R=255)
// 右灯条
cv::rectangle(scene, cv::Point(360, 120), cv::Point(400, 280),
cv::Scalar(0, 0, 255), -1); // 纯红色竖直矩形
cv::imwrite("01_original_scene.jpg", scene);
std::cout << " -> 已保存 01_original_scene.jpg(原始场景图)" << std::endl;
@@ -177,6 +178,8 @@ int main()
// 创建结果图:在原图上画检测框
cv::Mat result = scene.clone(); // clone() 创建一个完全相同的副本
std::cout << " -> 共找到 " << contours.size() << " 个轮廓" << std::endl;
int valid_count = 0; // 统计有效灯条的个数
for (size_t i = 0; i < contours.size(); i++)
{