用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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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],[…