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

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.xdnf.cn/news/17959.html

相关文章:

  • 36 C++ STL模板库5-string
  • %in%与`==
  • pnpm常用命令;为什么使用pnpm?
  • CV 医学影像分类、分割、目标检测,之【肺结节目标检测】项目拆解
  • 华为6730交换机恢复接口默认配置
  • 疏老师-python训练营-Day45Tensorboard使用介绍
  • elasticsearch冷热数据读写分离!
  • 数学建模-非线性规划模型
  • Linux编程1:进程和线程
  • 目标检测-动手学计算机视觉12
  • 爱情的本质及模拟推演
  • 机器翻译:Hugging Face库详解
  • 模型选择与调优
  • Java 并发新范式:用 Structured Concurrency 优雅收拾多线程烂摊子
  • Linux软件编程:进程和线程
  • 【软考中级网络工程师】知识点之入侵防御系统:筑牢网络安全防线
  • Linux中Samba服务配置与使用指南
  • 计算机毕设大数据选题推荐 基于spark+Hadoop+python的贵州茅台股票数据分析系统【源码+文档+调试】
  • 百川开源大模型Baichuan-M2的医疗能力登顶第一?
  • Flink CDC 实战:实时监听 MySQL Binlog 并同步到 Kafka
  • 《贵州棒球百科》体育赛事排名·棒球1号位
  • 面试题:如何用Flink实时计算QPS
  • 【120页PPT】人工智能与数字化转型的业财融合(附下载方式)
  • 计算机视觉第一课opencv(二)保姆级教
  • 解决SQL Server连接失败:Connection refused: connect
  • H.264、H.265 到 H.266:编码标准演进、RTSP支持与实时视频系统实战
  • 嵌入式学习(day26)frambuffer帧缓冲
  • Vue内置组件全解析:从入门到面试通关
  • 三种DuckDB电子表格插件的union all查询性能对比
  • 基于C语言基础对C++的进一步学习_C和C++编程范式、C与C++对比的一些补充知识、C++中的命名空间、文件分层