用Python和OpenCV從零搭建一個完整的雙目視覺系統(二)

?本系列文章旨在系統性地闡述如何利用 Python 與 OpenCV 庫,從零開始構建一個完整的雙目立體視覺系統。

本項目github地址:https://github.com/present-cjn/stereo-vision-python.git

項目架構設計:藍圖、分工與工作流

在上一篇文章中,我們了解了雙目立體視覺的基本原理和核心流程。在正式編寫算法之前,我們必須先做好一件事——搭建一個堅實、清晰、可擴展的項目框架

這就像建造一座大廈,我們不能直接開始砌墻,而是需要先有一份精密的建筑藍圖。一個好的項目架構,能讓我們的代碼思路清晰、易于維護、便于測試,并且在未來增加新功能時游刃有余。告別將所有代碼都堆砌在單個文件里的“面條式代碼”,是每一位開發者從入門走向專業的必經之路。

本文將詳細剖析我們這個雙目視覺項目的“建筑藍圖”,解釋每個模塊的職責分工和它們之間的協作關系。

📂 項目目錄結構一覽

下面是項目的整體目錄結構,這個結構是我們所有討論的基礎。

stereo-vision-project/
├── main.py                 # 主程序入口,命令行界面
├── config.py               # 所有配置參數
├── requirements.txt        # 項目依賴
│
├── calibration/            # 相機標定模塊
│   └── calibrator.py
├── processing/             # 核心處理模塊
│   ├── stereo_matcher.py   # 立體匹配
│   └── reconstructor.py    # 三維重建
├── utils/                  # 通用工具函數
│   ├── file_utils.py       # 文件讀寫
│   ├── image_utils.py      # 圖像處理
│   └── sorting_utils.py    # 自然排序
├── visualization/          # 可視化模塊
│   └── visualizer.py
├── tests/                  # 測試代碼
│   └── ...
└── data/                   # 數據├── calibration_images/└── test_images/

程序入口與任務調度:main.py

main.py 是我們整個項目的唯一入口和總指揮。它的職責不是執行具體的算法,而是扮演一個“應用啟動器”“任務分發器”的角色。

  • 命令行界面 (CLI): 我們使用 Python 內置的 argparse 庫,將 main.py 打造成一個專業的命令行工具。用戶可以通過 python main.py calibratepython main.py run 來執行不同的任務,并通過 --verbose--view-3d 等參數來控制程序的行為。
  • 任務編排: main.py 負責按照邏輯順序,調用其他模塊中的類和函數,將整個雙目視覺的流水線串聯起來。它負責加載配置、執行標定或主應用流程,并最終呈現結果。

全局配置與狀態管理:config.py

這個文件是我們項目的全局配置中心。它遵循一個重要的設計原則:配置與代碼分離

  • 集中管理: 所有可以調整的參數,如文件路徑、算法超參數(SGBM的參數)、標定板的默認尺寸等,都集中存放在這里。
  • 便于調試與維護: 當我們需要調整算法效果時,只需要修改 config.py 中的數值,而無需觸及核心的算法邏輯代碼。這極大地提高了代碼的可維護性。
  • 運行時狀態: 它也承載了像 VERBOSE_MODE 這樣的全局運行時狀態,由 main.py 在啟動時根據命令行參數設置,供所有其他模塊查詢。

核心算法模塊:calibration/processing/

這兩個目錄存放了項目最核心的算法邏輯,每個模塊都負責一個獨立的、高度內聚的功能。

  • calibration/calibrator.py: 負責相機標定。該模塊實現了完整的兩步標定法,用于計算相機的內外參及畸變參數,并生成最終的 stereo_params.yml 配置文件。
  • processing/stereo_matcher.py: 負責立體匹配。該模塊使用 SGBM (半全局塊匹配) 算法,接收校正后的圖像對,計算并生成包含深度信息的視差圖。
  • processing/reconstructor.py: 負責三維重建。該模塊接收視差圖和相機幾何參數,通過 reprojectImageTo3D 函數將2D視差信息轉換為3D空間中的點云。

通用工具函數模塊:utils/

utils/ 目錄存放了各種通用的、可被項目中任何模塊復用的輔助函數。

  • file_utils.py: 負責所有與文件系統交互的操作,如保存和加載 .yml 標定文件、保存 .ply 點云文件。
  • image_utils.py: 負責通用的圖像處理任務,最核心的就是 rectify_stereo_pair 函數,用于立體校正。
  • sorting_utils.py: 提供 natural_sort_key 函數,解決在加載文件時 left_10.jpg 排在 left_2.jpg 前面的問題。

將這些工具函數獨立出來,能避免在多個地方寫重復的代碼,并讓核心算法模塊的邏輯更純粹。

可視化與用戶交互模塊:visualization/

這個模塊負責所有與用戶界面和結果展示相關的工作。它的職責是將程序內部的數據,以一種人類可讀的方式呈現出來。

  • 它包含了顯示各種中間結果(如角點圖、校正圖、視差圖)和最終成果(點云、交互式深度圖)的函數。
  • 它還負責處理所有的用戶界面交互,比如 _wait_for_key_or_window_close 輔助函數,確保程序能正確響應用戶的鍵盤和鼠標操作。

自動化測試模塊:tests/

tests/ 目錄存放了我們所有的自動化測試腳本。

  • 單元測試: 驗證某個獨立的函數或類是否按預期工作。
  • 穩定性測試: 驗證我們的算法(如兩步標定法)是否對輸入順序等無關變量不敏感,保證其健壯性。
  • 自動化: 通過 pytest 框架,我們可以一鍵運行所有測試,確保任何新的代碼改動都沒有破壞已有的功能。這是保證項目長期健康、可維護的基石。

總結

通過這樣一種模塊化的架構設計,我們將一個復雜的大問題,分解成了一系列職責單一、易于管理的小問題。每個模塊都可以被獨立地開發、測試和改進。

在下一篇文章中,我們將正式深入第一個核心算法模塊——calibration,剖析相機標定的每一個技術細節和代碼實現。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90596.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

億級流量下的緩存架構設計:Redis+Caffeine多級緩存實戰

億級流量下的緩存架構設計:RedisCaffeine多級緩存實戰 一、為什么需要多級緩存? 在億級流量場景下,單純依賴Redis會遇到三大瓶頸:網絡延遲:Redis遠程訪問通常需要1-5ms,QPS超過10萬時成為瓶頸資源成本&…

AI基建還能投多久?高盛:2-3年不是問題,回報窗口才剛開啟

高盛表示,盡管AI商業化變現仍處早期階段,但基于成本削減的第一階段回報已經顯現。預測到2030年AI自動化可為財富500強企業節省約9350億美元成本。分析師認為,這一早期收益足以支撐當前AI基礎設施投資水平,盡管增長率可能放緩。雖然…

【mac】快捷鍵使用指南

在Mac上,根據選擇對象的不同,在選擇時移動的方法也有所不同,以下是具體介紹: 移動文件或文件夾:可通過拖放操作移動。打開“訪達”(Finder),找到要移動的文件或文件夾,按…

CS144 lab2 tcp_receiver

1. 實驗目的 lab2 的目的是實現tcp的接收端。 主要包括兩方面 (1) 從發送端接收消息,使用Reassembler聚合字節流(Bytestream) (2)將確認號(ackno)和window size發回對端 …

【論文筆記】A Deep Reinforcement Learning Based Real-Time Solution Policy for the TSP

《基于 DRL 和 DCNN 的實時 TSP 求解策略》IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTATION SYSTEMS, VOL. 24, NO. 6, JUNE 2023一段話總結本文提出了一種基于深度強化學習(DRL) 和深度卷積神經網絡(DCNN) 的實時旅行商問題&am…

MMaDA:多模態大型擴散語言模型

集眾家之所長,成大一統。普林斯頓大學、北京大學、清華大學、字節跳動的研究者將“文本推理、多模態分析、圖像生成”三大方向融合在一個單一擴散模型里,并用恰當的優化策略來提升模型在各個方向的性能。 研究動機 研究人員致力于開發一個能夠處理多種模…

容器技術入門與Docker環境部署

容器技術入門與Docker環境部署Docker概述什么是 DockerDocker 的優勢Docker 的應用場景Docker 核心概念(1)鏡像(2)容器(3)倉庫Docker 安裝1.關閉系統防火墻和內核2.下載Docker的repo文件3.替換倉庫地址4.更新索引文件并安裝Docker5.添加國內鏡像站6.開啟Docker服務7.優化內核參…

【01】MFC入門到精通—— MFC新建基于對話框的項目 介紹(工作界面、資源視圖 、類視圖)

文章目錄1 創建工程2 運行3 工作界面介紹3. 1 類視圖 Class View3.2 如何打開 類視圖3.3 資源視圖1 創建工程 選擇菜單項 文件->新建->項目,彈出 “新項目” 對話框。 選擇 MFC,點擊下一步,然后鍵入工程名稱,本例取名“Add…

2025!在Windows的Python中安裝GDAL包(小白能成!)

最近更新 在2025.06.05日,GDAL發布預告:新版本將適配pipeline和向量讀寫功能。 直到2025.06.25日,最新的版本才算發行出來。 有朋友催我趕緊更新教程,我上次更新是3月份的時候了,恰好是GDAL上一個版本出來的時間。 前…

Python第一次作業

# 1.技術面試題**(1)TCP與UDP的區別是什么?****答:TCP 是 “可靠但較慢” 的協議,適合對數據完整性要求高的場景;UDP 是 “快速但不可靠” 的協議,適合對實時性要求高的場景。兩者互補&#xff…

Linux【大數據運維】下制作Redis綠色免安裝包(一)

linux下安裝Redis比較繁瑣,遇到內網部署環境更是麻煩。根據經驗將Redis打包一個綠色版進行使用。 大體思路,在一臺正常的機器上面制造好安裝包,然后上傳到內網服務器,解壓使用。 下載: wget https://download.redis…

89104 PCIe Switch芯片國產替代 - PCIE5.0國產AI服務器高性能擴展,支持海光/龍芯/飛騰等

以下是針對89104 PCIe Switch芯片國產替代的高性能PCIe 5.0 AI服務器擴展方案的詳細分析:一、核心國產替代芯片:TL63104控制器?技術規格?支持PCIe 5.0全速率(32 GT/s),提供968 Lanes配置,聚合雙向帶寬達1…

Docker跨架構部署實操

需求場景 python項目,開發環境以及可供測試的環境為X86架構下的LINUX服務器,但正式環境需要部署在ARM架構下的麒麟服務器,且正式環境后續可能會長時間處于斷網狀態,需要一份跨架構的部署方案。 解決思路 在 X86 上打包、在 ARM&am…

JavaScript 樹形菜單總結

樹形菜單是前端開發中常見的交互組件,用于展示具有層級關系的數據(如文件目錄、分類列表、組織架構等)。以下從核心概念、實現方式、常見功能及優化方向等方面進行總結。 一、核心概念 層級結構:數據以父子嵌套形式存在,如{ id: 1, children: [{ id: 2 }] }。節點:樹形結…

【python實用小腳本-131】Python 實現 HTML 到 PDF 轉換:解決文檔處理痛點的高效工具

引言 在當今數字化辦公環境中,文檔格式的轉換需求日益頻繁。假設你是一位市場營銷人員,需要將公司網站的產品介紹頁面(HTML 格式)轉換為 PDF 文檔,以便用于線下宣傳。然而,手動復制粘貼內容并調整格式不僅…

【Linux操作系統】簡學深悟啟示錄:Linux基本指令

文章目錄1.什么是操作系統?2.Xshell的使用3.常用指令3.1 ls指令3.2 pwd指令3.3 cd指令3.4 touch指令3.5 mkdir指令3.6 rmdir指令 && rm指令3.7 man指令3.8 cp指令3.9 mv指令3.10 cat指令3.11 echo指令(重定向)3.12 more指令3.13 less…

「py數據分析」04如何將 Python 爬取的數據保存為 CSV 文件

如何將 Python 爬取的數據保存為 CSV 文件 從原始網絡數據到純凈 CSV - 搭建通往分析的橋梁 恭喜你!經過前面的努力,你的 Python 腳本終于成功地從一個網站上爬取了數據,一個充滿信息的寶庫正靜靜地躺在你的變量中。但接下來呢?…

qemu vcpu的創建過程

在 QEMU 中,vCPU 線程的啟動流程涉及多個階段,包括初始化、線程創建和執行邏輯。以下是基于搜索結果的詳細分析: QEMU vCPU 線程的啟動流程 1. 初始化階段 設備實例化:QEMU 使用 QOM(QEMU Object Model)系統…

Spring Security架構與實戰全解析

Spring security1.安全架構1. 認證who are you登陸系統:用戶系統2. 授權權限管理:用戶授權3. 攻擊防護xss (cross-site scripting)csrf (cross-site request forgery)cors (cross-origin resource sharing)sql注入4. 擴展:權限管理模型a. RBA…

LeetCode Hot 100 搜索二維矩陣 II

編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性:每行的元素從左到右升序排列。每列的元素從上到下升序排列。示例 1:輸入:matrix [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[…