当前位置: 首页 > news >正文

2025 年电赛 C 题 发挥部分 1:多正方形 / 重叠正方形高精度识别与最小边长测量

2025 年全国大学生电子设计竞赛 C 题

发挥部分 1:多正方形 / 重叠正方形高精度识别与最小边长测量

香橙派 + OpenCV C++ 全流程解析


目录

  1. 赛题背景与需求
  2. 技术难点全景图
  3. 系统总体架构
  4. 硬件平台与接线
  5. 软件架构与线程模型
  6. 算法流水线逐帧拆解
    • 6.1 图像预处理
    • 6.2 轮廓提取与面积过滤
    • 6.3 重叠正方形分割:向量夹角法
    • 6.4 最小正方形边长计算
    • 6.5 透视畸变补偿
    • 6.6 亚像素级优化
  7. 关键代码剖析
  8. 香橙派编译与烧录
  9. 调试工具链
  10. 性能 Benchmark
  11. 常见问题 FAQ
  12. 拓展阅读与开源仓库

1 赛题背景与需求

2025 年电赛 C 题 发挥部分 1 要求:

指标说明
目标正方形组合图形,6 cm ~ 12 cm 边长
状态可彼此分离,也可 局部重叠 ≤ 30 %
输出最小正方形边长,误差 ≤ 0.5 cm
限制单目固定摄像头,禁止 PC,一键启动,5 s 内完成

2 技术难点全景图

难点场景示例传统方案痛点本文解决策略
边缘粘连两正方形重叠 25 %大轮廓误判为 1 个向量夹角分割
透视拉伸视角倾斜 45°像素长度失真Homography + cosθ 补偿
实时性720 p 30 fpsCPU 满载 80 %NEON + ROI 裁剪
量化误差像素 → 厘米±1 px ≈ ±0.8 cm亚像素角点
零依赖现场无网Tesseract 不可用纯 OpenCV

3 系统总体架构

在这里插入图片描述

4 硬件平台与接线

模块接口引脚供电备注
OV5640MIPI-CSICAM13.3 V自带 24 MHz 时钟
OLEDI²C1PB8_SCL PB9_SDA3.3 V128×64 SSD1306
按键GPIOPC133.3 V一键启动
调试串口UART0PA9_TX PA10_RX5 V→3.3 VCH340G

5 软件架构与线程模型

  • main.cpp
    • 初始化摄像头 → 启动 4 个 std::thread
  • pic_deal.cpp
    • 预处理、轮廓、重叠分割、最小边计算
  • thread_deal.cpp
    • 多线程队列 & 条件变量无锁同步
  • uart.cpp
    • 实时日志 + 结果回传

6 算法流水线逐帧拆解

6.1 图像预处理

Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
Ptr<CLAHE> clahe = createCLAHE(2.0, Size(8,8));
clahe->apply(gray, gray);
GaussianBlur(gray, blur, Size(5,5), 1);
Canny(blur, edges, 50, 150);

6.2 轮廓提取与面积过滤

vector<vector<Point>> contours;
findContours(edges, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
vector<RotatedRect> candidates;
for(auto& c : contours){double a = contourArea(c);if(a < 500 || a > 0.3*frame.total()) continue;RotatedRect rr = minAreaRect(c);float ratio = rr.size.width/rr.size.height;if(ratio > 0.9f && ratio < 1.1f)candidates.push_back(rr);
}

6.3 重叠正方形分割:向量夹角法

6.3.1 四边形顶点排序
vector<Point2f> orderPointsAlongContour(const vector<Point>& contour,const vector<Point2f>& pts){vector<float> cumLen(contour.size());float acc = 0;for(size_t i=1;i<contour.size();++i){acc += norm(contour[i]-contour[i-1]);cumLen[i]=acc;}/* 省略累积归一化与二分查找 */return ordered;
}
6.3.2 向量夹角验证
const double ANGLE_THRESH = CV_PI/18.0; // 10°
for(size_t i=0;i<ordered.size();i+=4){Point2f v1 = ordered[(i+1)%4]-ordered[i];Point2f v2 = ordered[(i+2)%4]-ordered[(i+1)%4];double angle = fabs(atan2(v1.cross(v2), v1.dot(v2)));if(angle < ANGLE_THRESH){squares.emplace_back(ordered[i], ordered[(i+1)%4]);}
}

6.4 最小正方形边长计算

double minSide = DBL_MAX;
for(const auto& sq : squares){double len = norm(sq.first - sq.second);minSide = std::min(minSide, len * scale_w);
}
squareEdgeResult.minEdgeLength = minSide;

6.5 透视畸变补偿

  • Homography 计算:利用 A4 纸 4 角点
  • cosθ 修正
    在这里插入图片描述

6.6 亚像素级优化

cornerSubPix(gray, corners, Size(5,5), Size(-1,-1),TermCriteria(TermCriteria::EPS+TermCriteria::MAX_ITER, 30, 0.001));

7 关键代码剖析

文件职责亮点
shibie_Square_min.cpp重叠分割 + 最小边向量夹角法零依赖
pic_deal.cpp全流程NEON intrinsics 加速
thread_deal.cpp多线程无锁队列 + condition_variable

8 香橙派编译与烧录

8.1 依赖

sudo apt update
sudo apt install build-essential cmake libopencv-dev

8.2 一键脚本

git clone https://github.com/langhaofu/2025-C-Software.git
cd 2025-C-Advance
chmod +x build.sh run.sh
./build.sh   # 约 45 秒
./run.sh     # 自动识别 /dev/video0

9 调试工具链

工具用途指令
htopCPU 占用htop
perfNEON 指令perf stat ./bin/2025_C
v4l2-ctl摄像头参数v4l2-ctl -d 0 --list-formats-ext
imwrite("debug.jpg")中间结果现场回溯

10 性能 Benchmark

场景真值测量误差耗时
两正方形重叠 25 %最小 8 cm8.1 cm0.1 cm1.7 s
三正方形并排最小 6 cm6.0 cm0.0 cm1.5 s
倾斜 40° 重叠最小 10 cm10.2 cm0.2 cm1.8 s
随机 5 正方形最小 7 cm7.1 cm0.1 cm1.6 s

11 常见问题 FAQ

问题根因解决
最小边 0 cm角点 <4 个降低 Canny 阈值
重叠未分割面积过滤过严调低 minArea
CPU 100 %NEON 未开启-mfpu=neon
画面卡顿分辨率过高锁 640×480

12 拓展阅读与开源仓库

  • GitHub:github.com/langhaofu/2025-C-Software
  • 香橙派镜像:2025-C-ubuntu-22.04-lite.img.xz

本方案 纯 OpenCV 实现,已在现场验证 1.8 s 完成全流程。欢迎 Star & PR!

http://www.dtcms.com/a/331769.html

相关文章:

  • 悲观锁乐观锁与事务注解在项目实战中的应用场景及详细解析
  • 如何解决EMI中传导干扰
  • Spring-解决项目依赖异常问题
  • 【从零开始java学习|第六篇】运算符的使用与注意事项
  • 因果推断在用户流失预警的案例研究
  • 第2节:多模态的核心问题(多模态大模型基础教程)
  • 【Unity3D】Spine 3.8版本使用记录
  • 机器学习入门:从概念到实践的核心知识梳理
  • 【Linux系统】进程的生命旅程:从创建到独立的演绎
  • 智能体评测技术与实践:从评估维度到DeepEval实战指南
  • LeetCode Day6 -- 图
  • 速卖通商品详情接口深度开发:从多语言解析到跨境合规处理
  • 从零开始搭建React+TypeScript+webpack开发环境——基于MobX的枚举数据缓存方案设计与实践
  • react + i18n:国际化
  • HTML5二十四节气网站源码
  • 【web自动化】-1- 前端基础及selenium原理和环境安装
  • 传输层协议TCP(3)
  • Observer:优雅管理事件订阅的秘密武器
  • TCP 连接管理:深入分析四次握手与三次挥手
  • C++:浅尝gdb
  • 创客匠人:共情力在创始人IP塑造中的作用
  • 使用Docker和Miniconda3搭建YOLOv13开发环境
  • 如何在 Ubuntu 24.04 LTS Noble Linux 上安装 Wine HQ
  • Java多线程进阶-深入synchronized与CAS
  • RS232串行线是什么?
  • 考研408《计算机组成原理》复习笔记,第五章(1)——CPU功能和结构
  • C#WPF实战出真汁01--搭建项目三层架构
  • 解决 pip 安装包时出现的 ReadTimeoutError 方法 1: 临时使用镜像源(单次安装)
  • LeetCode 1780:判断一个数字是否可以表示成3的幂的和-进制转换解法
  • 基于 LDA 模型的安徽地震舆情数据分析