当前位置: 首页 > 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.lryc.cn/news/621420.html

相关文章:

  • 待办事项小程序开发
  • Multimodal RAG Enhanced Visual Description
  • 容器运行时支持GPU,并使用1panel安装ollama
  • 【嵌入式C语言】四
  • 20道前端性能优化面试题精华
  • python学习DAY41打卡
  • 低配硬件运行智谱GLM-4.5V视觉语言模型推理服务的方法
  • 《WebGL中FBO的底层运行逻辑》
  • 基于ECharts和EdgeOne打造云上智能图表
  • 编排之神-Kubernetes中的微服务介绍及演练
  • (2-10-1)MyBatis的基础与基本使用
  • 大数据项目_基于Python+hadopp的城市空气污染数据关联性可视化分析系统源码_基于机器学习的城市空气污染预测与分析系统的设计与实现
  • C/C++ 进阶:深入解析 GCC:从源码到可执行程序的魔法四步曲
  • 卫星通信链路预算之七:上行载噪比计算
  • 【C#】PNG 和 JPG、JPEG的应用以及三种格式的区别?
  • [系统架构设计师]软件工程基础知识(五)
  • 《量子雷达》第5章 量子雷达发射机 预习2025.8.14
  • “Zen 5”: The AMD High-Performance 4nm x86-64 Microprocessor Core
  • 接口测试用例的编写
  • Avalonia_SukiUI明暗主题切换时部分元素颜色不变
  • vue内置组件
  • 基于wireshark的USB 全速硬件抓包工具USB Sniffer Lite的使用
  • 打靶日常-CSRF
  • pytorch学习笔记-加载现有的网络模型(VGG16)、增加/修改其中的网络层(修改为10分类)
  • 分布式锁—Redisson的公平锁
  • 如何更好地使用AI编程?
  • MySQL窗口函数与PyMySQL以及SQL注入
  • C#笔记啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
  • JavaScript 解构赋值语法详解
  • 开源卫星软件平台LibreCube技术深度解析