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 時鐘
OLEDI2C1PB8_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
英文地址,請注明出處:http://en.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;如基因數據、推薦系統用…