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.pswp.cn/bicheng/93433.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【自动驾驶】自动驾驶概述 ② ( 自动驾驶技术路径 | L0 ~ L5 级别自动驾驶 )

文章目录一、自动驾驶技术路径1、L0 级别 自动驾驶2、L1 级别 自动驾驶3、L2 级别 自动驾驶4、L3 级别 自动驾驶5、L4 级别 自动驾驶6、L5 级别 自动驾驶一、自动驾驶技术路径 美国汽车工程师学会 ( SAE ) 将 自动驾驶 分为 L0 ~ L5 六个级别 : 其中 L0 级别 是 完全手动 , L5…

C++少儿编程(二十二)—条件结构

1.理解条件结构小朋友们&#xff0c;今天让我们一起来探索一个神奇而有趣的知识——程序的条件结构&#xff01;首先&#xff0c;让我们来想象一个有趣的场景。比如说&#xff0c;你们正在准备去公园玩耍。在出发之前&#xff0c;你们会看看天气怎么样。如果天气晴朗&#xff0…

Ubuntu20.04下Px4使用UORB发布消息

1 .msg文件夹定义数据类型及 变量名文件位置如图&#xff0c;在PX4-Autopilot/msg文件夹下&#xff0c;笔者创建的文件名为gps_msg.msggps_msg.msg内容如下 uint64 timestamp # 时间戳 float32 latitude float32 longitude float32 altitude 同时&#xff0c;在CM…

three.js学习记录(第二节:鼠标控制相机移动)

效果展示&#xff1a; 鼠标控制一、鼠标控制 - 轨道控制器&#xff08;OrbitControls&#xff09; 1. 从nodeModules中导入OrbitControls&#xff0c;OrbitControls 是一个附加组件&#xff0c;必须显式导入 import { OrbitControls } from "three/examples/jsm/controls/…

Shortest Routes II(Floyd最短路)

题目描述There are n cities and m roads between them. Your task is to process q queries where you have to determine the length of the shortest route between two given cities.输入The first input line has three integers n, m and q: the number of cities, roads…

分享一个基于Hadoop的二手房销售签约数据分析与可视化系统,基于Python可视化的二手房销售数据分析平台

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Spark、hadoop、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题…

STM32的PWM

PWM作为硬件中几乎不可或缺的存在&#xff0c;学会 PWM&#xff0c;等于打通了 STM32 的“定时器体系”。学一次&#xff0c;STM32 全系列&#xff08;甚至 AVR、PIC、ESP32&#xff09;都能通用。硬件只要一个 I/O 就能驱动功率模块&#xff0c;非常省成本。不会 PWM&#xff…

OpenCompass傻瓜式入门教程

文章目录1 我也许不是傻瓜&#xff0c;却只想做个傻瓜2 环境要求3 安装3.1 下载源码3.2 创建虚拟环境3.3 安装4 下载数据5 查看支持的模型和数据集6 评测6.1 指定模型路径6.2 指定配置文件6.2.1 评测本地qwen2.5模型6.2.1.1 查看opencompass支持的qwen2.5模型6.2.1.2 创建配置文…

【软件测试】电商购物项目-各个测试点整理(三)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、优惠券的测试点…

流处理、实时分析与RAG驱动的Python ETL框架:构建智能数据管道(上)

> **2025年某电商大促,每秒20万订单涌入系统**——他们的风控团队仅用**47毫秒**就识别出欺诈交易。背后的秘密武器,正是融合流处理、实时分析与RAG的下一代Python ETL框架。 ### 一、范式革命:从批处理到AI增强的ETL 4.0 #### 1.1 数据处理演进史 ```mermaid graph LR …

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘

文章的目的为了记录使用Arkts 进行Harmony app 开发学习的经历。本职为嵌入式软件开发&#xff0c;公司安排开发app&#xff0c;临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 Arkts …

​​​​​​​中国工业企业专利及引用被引用数据说明

1319 中国工业企业专利及引用被引用数据说明数据简介专利近年发文趋势及主题分布今天数据皮皮侠团队为大家分享一份2023年12月25日最新更新的中国工业企业专利及引用被引用数据&#xff0c;供大家研究使用。数据来源原始数据来源于国家统计局&#xff0c;由皮皮侠团队整理计算。…

MySQL知识点(上)

MySQL知识点 一&#xff1a;MySQL概述 MySQL是一款开源的数据库软件&#xff0c;是一种关系型数据库管理系统&#xff08;ROBMS&#xff09;&#xff0c;也叫做表数据库管理系统 如果需要快速安全地处理大量的数据&#xff0c;则必须使用数据库管理系统&#xff1b;任何基于数据…

shell脚本实现sha256sum校验并拷贝校验通过的文件

#!/bin/bash# 目标目录 TARGET_DIR"/appdata/jn1m/versions/old/bin"# 校验文件 CHECKSUM_FILE"checksum.txt"# 检查目标目录是否存在 if [ ! -d "$TARGET_DIR" ]; thenecho "错误&#xff1a;目标目录 $TARGET_DIR 不存在"exit 1 fi#…

中小型泵站物联网智能控制系统解决方案:构建无人值守的自动化泵站体系

一、系统核心架构与功能设计1.物联网感知层设备互联&#xff1a;网关对接压力传感器、超声波液位计、智能电表、振动传感器等&#xff0c;实时采集水泵运行状态&#xff08;流量、压力、温度、振动&#xff09;、液位、水质&#xff08;pH值、浊度&#xff09;、能耗等关键参数…

网络通信---Axios

1、什么是 Axios&#xff1f; Axios​ 是一个基于 ​Promise​ 的 ​HTTP 客户端&#xff0c;用于浏览器和 Node.js 环境&#xff0c;用来发送 ​HTTP 请求&#xff08;如 GET、POST、PUT、DELETE 等&#xff09;​。 它常用于&#xff1a; 向后台 API 发送请求获取数据提交表…

Ubuntu 软件源版本不匹配导致的依赖冲突问题及解决方法

在使用 Ubuntu 系统的过程中&#xff0c;软件包管理是日常操作的重要部分。但有时我们会遇到各种依赖冲突问题&#xff0c;其中软件源与系统版本不匹配是常见且棘手的一种。本文就来详细分享一次因软件源版本不匹配引发的依赖冲突问题&#xff0c;以及具体的解决思路和流程。一…

思考:高速场景的行星轮混动效率如何理解

行星轮混动 E-CVT&#xff08;电子无级变速器&#xff09;是一种专为混合动力汽车设计的动力分配系统&#xff0c;其核心原理是通过行星齿轮组和电机的协同工作&#xff0c;实现动力分流与无级变速。 一、核心结构与组成 E-CVT的核心部件包括 行星齿轮组 和 双电机&#xff08;…

跨域及解决方案

跨域&#xff08;Cross-Origin&#xff09;是指浏览器在执行 JavaScript 的时候&#xff0c;因为同源策略&#xff08;Same-Origin Policy&#xff09;的限制&#xff0c;阻止了一个网页去请求不同源&#xff08;域名、端口、协议有任意一个不同&#xff09;的资源。 1. 什么是…

PCA降维全解析:从原理到实战

一文读懂PCA降维&#xff1a;原理、实现与可视化全解析​本文6000字&#xff0c;涵盖PCA核心原理、数学推导、代码实战及高频面试题&#xff0c;建议收藏阅读​一、为什么需要降维&#xff1f;数据爆炸时代的生存法则当数据集的特征维度激增&#xff08;如基因数据、推荐系统用…