【OpenCV-Python】教程:6-4 Depth Map from Stereo Images 立体图像的深度图

2024-02-09 22:10

本文主要是介绍【OpenCV-Python】教程:6-4 Depth Map from Stereo Images 立体图像的深度图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenCV Python Depth Map from Stereo Images 立体图像的深度图

【目标】

  • 通过立体图像创建一个深度图

【理论】

上一节中,我们学习了一些基本概念,如对极约束和其他一些相关术语。我们还可以看到,如果我们有同一个场景的两张图像,我们可以以一种直观的方式获得深度信息。

在这里插入图片描述

上图包含等价三角形。写出它们的等价方程,得到如下结果:

d i s p a r i t y = x − x ′ = B f Z disparity=x-x'=\frac{Bf}{Z} disparity=xx=ZBf

x x x x ′ x' x为图像平面中与场景点3D对应的点与其相机中心之间的距离。 B B B是两个相机之间的距离(我们知道), f f f是相机的焦距(已经知道)。所以简而言之,上面的方程说的是,场景中一个点的深度与对应图像点与其相机中心的距离之差成反比。因此,有了这些信息,我们可以推导出图像中所有像素的深度。

所以它会在两张图像之间找到对应的匹配。我们已经看到了极线约束如何使这个操作更快更准确。一旦找到匹配,它就会发现差异。

【代码】

在这里插入图片描述

import numpy as np 
import cv2 imgL = cv2.imread("assets/tsukuba_l.png", 0)
imgR = cv2.imread("assets/tsukuba_r.png", 0)stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(imgL, imgR)
disparity = np.uint8(disparity)cv2.imshow("L", imgL)
cv2.imshow("R", imgR)
cv2.imshow("depth", disparity)
cv2.waitKey(0)
cv2.destroyAllWindows()

【接口】

  • StereoSGBM_create
cv.StereoSGBM_create(	[, minDisparity[, numDisparities[, blockSize[, P1[, P2[, disp12MaxDiff[, preFilterCap[, uniquenessRatio[, speckleWindowSize[, speckleRange[, mode]]]]]]]]]]]	) ->	retval

创建 StereoSGBM 对象

  • minDisparity: 最小可能的视差值,正常情况下为零,但有时校正算法会对图像进行移位,因此需要对该参数进行相应的调整。
  • numDisparities: 最大视差减去最小视差。该值总是大于零。在当前实现中,该参数必须能被16整除。
  • blockSize: 匹配的块大小。它必须是奇数>=1。通常情况下,它应该在 3~11范围内。
  • P1: 控制视差平滑度的第一个参数
  • P2: 控制视差平滑度的第二个参数,值越大,越平滑。P1是对相邻像素之间的视差变化±1的惩罚。P2是对相邻像素之间的视差变化超过1的惩罚。算法要求P2 > P1。参见 stereo_match.cpp示例,其中显示了一些相当不错的P1和P2值(例如分别为 8*number_of_image_channels*blockSize*blockSize32*number_of_image_channels*blockSize*blockSize)。
  • disp12MaxDiff: 在左右图差异检查中允许的最大差异(整数像素单位)。将其设置为非正值以禁用检查。
  • preFilterCap: 预过滤图像像素的截断值。该算法首先计算每个像素的x导数,并按 [-preFilterCap, preFilterCap]区间剪辑其值。结果值被传递给 Birchfield-Tomasi像素代价函数。
  • uniquenessRatio: 计算出的最佳(最小)代价函数值应该“赢得”第二个最佳值以认为找到的匹配正确的百分比差额。通常,5-15之间的值就足够了。
  • speckleWindowSize: 平滑视差区域的最大大小,以考虑其噪声斑点和无效。将其设置为0以禁用散斑滤波。否则,将其设置在 50-200范围内。
  • speckleRange: 每个连接组件内的最大视差变化。如果进行散斑滤波,将参数设置为正值,它将隐式乘以 16。通常,12就足够了。
  • mode: 设置为 StereoSGBM::MODE_HH 可运行全尺寸两步动态规划算法,将会消耗 O(W*H*Disparities) 字节,对于640x480 图像来说很大,对于 HD-尺寸图像来说就是巨大的了。缺省值为false。

其他成员见

OpenCV: cv::StereoSGBM Class Reference

【参考】

  1. OpenCV: Depth Map from Stereo Images
  2. Ros stereo img processing wiki page
  3. OpenCV: cv::StereoSGBM Class Reference

这篇关于【OpenCV-Python】教程:6-4 Depth Map from Stereo Images 立体图像的深度图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/695411

相关文章

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核