【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

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python中局部变量和全局变量举例详解

《Python中局部变量和全局变量举例详解》:本文主要介绍如何通过一个简单的Python代码示例来解释命名空间和作用域的概念,它详细说明了内置名称、全局名称、局部名称以及它们之间的查找顺序,文中通... 目录引入例子拆解源码运行结果如下图代码解析 python3命名空间和作用域命名空间命名空间查找顺序命名空

Python如何将大TXT文件分割成4KB小文件

《Python如何将大TXT文件分割成4KB小文件》处理大文本文件是程序员经常遇到的挑战,特别是当我们需要把一个几百MB甚至几个GB的TXT文件分割成小块时,下面我们来聊聊如何用Python自动完成这... 目录为什么需要分割TXT文件基础版:按行分割进阶版:精确控制文件大小完美解决方案:支持UTF-8编码

基于Python打造一个全能文本处理工具

《基于Python打造一个全能文本处理工具》:本文主要介绍一个基于Python+Tkinter开发的全功能本地化文本处理工具,它不仅具备基础的格式转换功能,更集成了中文特色处理等实用功能,有需要的... 目录1. 概述:当文本处理遇上python图形界面2. 功能全景图:六大核心模块解析3.运行效果4. 相

Python中的魔术方法__new__详解

《Python中的魔术方法__new__详解》:本文主要介绍Python中的魔术方法__new__的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、核心意义与机制1.1 构造过程原理1.2 与 __init__ 对比二、核心功能解析2.1 核心能力2.2

在PyCharm中安装PyTorch、torchvision和OpenCV详解

《在PyCharm中安装PyTorch、torchvision和OpenCV详解》:本文主要介绍在PyCharm中安装PyTorch、torchvision和OpenCV方式,具有很好的参考价值,... 目录PyCharm安装PyTorch、torchvision和OpenCV安装python安装PyTor

Python虚拟环境终极(含PyCharm的使用教程)

《Python虚拟环境终极(含PyCharm的使用教程)》:本文主要介绍Python虚拟环境终极(含PyCharm的使用教程),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录一、为什么需要虚拟环境?二、虚拟环境创建方式对比三、命令行创建虚拟环境(venv)3.1 基础命令3

Python Transformer 库安装配置及使用方法

《PythonTransformer库安装配置及使用方法》HuggingFaceTransformers是自然语言处理(NLP)领域最流行的开源库之一,支持基于Transformer架构的预训练模... 目录python 中的 Transformer 库及使用方法一、库的概述二、安装与配置三、基础使用:Pi

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例