深入探讨基于python的SGBM参数影响效果

什么是SGBM

SGBM(Semi-Global Block Matching)是一种用于计算双目视觉中视差(disparity)的半全局匹配算法,在OpenCV中的实现为semi-global block matching(SGBM)。它是基于全局匹配算法和局部匹配算法的优缺点,提出了一种折中的方法,既能保证视差图的质量,又能降低计算复杂度。

SGBM的原理

SGBM的原理可以分为以下几个步骤:

  1. 预处理:使用水平Sobel算子对左右图像进行边缘检测,得到梯度图像。
  2. 匹配代价计算:对于每个像素,计算其在不同视差下与对应像素的匹配代价,通常使用绝对差或平方差作为代价函数。
  3. 能量函数最小化:对于每个像素,定义一个能量函数,包括数据项和平滑项。数据项表示匹配代价,平滑项表示相邻像素的视差连续性。使用动态规划的方法,沿着多个方向(通常为8个或16个)计算累积代价,并求取最小值作为最终代价。
  4. 视差图生成:对于每个像素,根据最终代价选择最佳视差,并生成视差图。
  5. 视差图后处理:对于视差图中的异常值或空洞,使用一些后处理方法进行修复或填充,例如中值滤波、WLS滤波等。

SGBM的参数

SGBM的参数有以下几个:

  • minDisparity:最小视差值,默认为0。
  • numDisparities:视差范围,默认为16。必须是16的整数倍。
  • blockSize:匹配块大小,默认为3。必须是奇数且大于1。
  • P1:控制视差平滑度的第一个参数,默认为8blockSizeblockSize。P1越大,越倾向于生成连续的视差图。
  • P2:控制视差平滑度的第二个参数,默认为32blockSizeblockSize。P2越大,越倾向于消除小的视差变化。P2必须大于P1。
  • disp12MaxDiff:左右一致性检查时允许的最大视差差异,默认为-1,表示不进行检查。
  • preFilterCap:预处理时截断梯度值的上限,默认为63。
  • uniquenessRatio:唯一性检查时的阈值,默认为10。表示最佳视差值与次佳视差值之间的比例要大于该阈值才被认为是有效的。
  • speckleWindowSize:消除噪声斑点时考虑的窗口大小,默认为0,表示不进行消除。
  • speckleRange:消除噪声斑点时考虑的最大视差变化,默认为0,表示不进行消除。
  • mode:SGBM算法选择模式,默认为StereoSGBM::MODE_SGBM。可选值有StereoSGBM::MODE_SGBM_3WAY(速度快)、StereoSGBM::MODE_HH4(速度慢)、StereoSGBM::MODE_SGBM(速度中等)、StereoSGBM::MODE_HH(速度慢)。

SGBM的参数变化

下面通过调整每个参数来观察其影响效果:
初始值设置:

minDisparity = 0
numDisparities = 16
blockSize = 3
P1 = 8*blockSize*blockSize
P2 = 32*blockSize*blockSize
disp12MaxDiff = -1
preFilterCap = 63
uniquenessRatio = 10
speckleWindowSize = 0
speckleRange = 0

numDisparities: 视差数量越多,能够获取到更多详细的深度信息。但是,增加视差数量也会增加计算量,可能会导致较慢的运行速度以及噪声增多,且增大numDisparities会扩大视差范围,即视差图中可以估计的深度范围增大。如果增大的视差范围超过了场景中实际的深度范围,就会出现黑色区域。黑色区域表示无法进行有效的匹配或估计深度。

minDisparity: 最小视差越大,物体离相机近的程度就会变小。如果提高最小视差,则可能会使视差图被高估,因为物体不可能有大于最小视差的负的视差值。而如果最小视差过低,则可能会受到噪声的影响,产生错误的视差值。

blockSize: 所选的窗口大小越大,所包含的像素就越多,从而产生更稳定,但粗略的视差图。减小块大小,可以获得反之,一些锐利但可能嘈杂(即不确定)的视差边缘。

P1 和 P2: 两种参数都是控制视差变化规则的,从而使结果更平滑,增加这些值会使抗噪声能力更强但同时会失去保留锐度的细节。如果P1和P2参数值过小,则会使视差图中出现许多噪声或未对齐的图像。如果参数值太高,将导致平滑的结果,丢失更多的细节和锐度。

disp12MaxDiff: 这个参数用于限制左右视图之间的最大视差数量差异。增加这个值可能会导致插值和未对齐的像素点在图像中显示。但太小的值,则视差较光滑,缺少细节特征。

uniquenessRatio: 这个参数是用来控制像素值的唯一性,如果唯一性比例越高,则得到的视差图的噪声和未对齐的像素会越小。但如果唯一性比例太高,则有可能会失去细节特征。

speckleWindowSize: 这个参数被用来滤除孤立噪点或者离群值,如果窗口太小,则没有过滤到足够的噪声点而窗口太大则会损失一些细节特征。

speckleRange: 这个参数规定一个视差变化的阈值,如果发现视差变化超出了这个阈值,则这个像素应该是一些无用的孤立像素。适当调整该参数可以使其过滤掉孤立的杂点和噪声。

preFilterCap: 该参数控制了像素的最大值。如果已经将值限制在负值的范围内,那么它必须和像素值相比较,过滤掉那些值过大的像素点。

mode: SGBM算法的解释模式,分别为SGBM,HHSGBM和SGBM_3WAY。这些模式包含了不同的参数设定,也会影响到视差图的效果。

  • SGBM:这是默认的解释模式,也是最常用的模式。它代表了Semi-Global Block Matching (SGBM) 算法,该算法利用全局视差的一致性来获得更准确的视差图。
  • HHSGBM:这代表了H.Hirschmüller的快速近似SGBM算法(H.Hirschmüller’s Hierarchical Semi-Global Block Matching),是一种更快速的算法。它在速度上相对于标准SGBM算法有所优化,但可能在某些情况下会牺牲一些准确性。
  • SGBM_3WAY:这是一种三通道SGBM算法,它将输入图像的三个通道(BGR)分别作为独立的视差图像进行处理。然后,将三个视差图像中的像素最小化,从而得到最终的视差图。这种方法可以改善处理彩色图像时的准确性。


原文链接SGBM你不知道的秘密:深入探讨SGBM参数影响效果
评论获取源码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/131329.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Matlab 2016安装MinGW-w64-4.9.2

Matlab 2016安装MinGW-w64-4.9.2 项目需求:需要将matlab中的.m文件编译为cpp文件 .dll .h .lib。 我相信大家在对matlab2016安装MinGW-w64出现了各种各样的问题。如:4.9.2安装失败;安装了其他版本但是matlab检测不到,或者其他各种…

Matlab之DICOM(数字图像和通信医学)格式图像数据读取函数dicomread

一、DICOM是什么? DICOM是数字图像和通信医学格式的图像数据,在MATLAB中,可以使用dicomread函数读取DICOM格式的图像数据。 二、dicomread函数 使用方法如下: imageData dicomread(filename);其中,filename表示DI…

pdfjs解决ie浏览器预览pdf问题

pdfjs是一个js库,可以将pdf文件用canvas重新绘制,从而无需借助pdf读取插件就可以直接预览。 目前chrome内核的浏览器已内置pdf读取插件,但ie浏览器还没有。而我们最近在做的一个项目使用对象是医院,使用的浏览器竟然还是ie。所以我…

基础秘钥、公钥、地址的熟悉指南

1. 地址 0基础漫画式阅读:https://www.cnblogs.com/charlesblc/p/6130433.html 清晰详细的地址生成解释:比特币:账户私钥、公钥、地址的生成 - kumata - 博客园 (cnblogs.com) 对原理更详细解释:区块链技术核心篇之二&#xff…

在微信小程序上怎么实现多门店管理功能

微信小程序已经成为连接线上与线下的重要工具,尤其对于拥有多家门店的企业来说,通过微信小程序可以实现多门店管理,提高管理效率和用户体验。下面,我将为大家详细介绍如何在微信小程序上实现多门店管理功能。 一、确定多门店管理功…

【网络教程】记一次使用Docker手动搭建BT宝塔面板的全过程(包含问题解决如:宝塔面板无法开启防火墙,ssh,nginx等)

文章目录 准备安装安装宝塔面板开启ssh和修改ssh的密码导出镜像问题解决宝塔面板无法开启防火墙无法启动ssh设置密码nginx安装失败设置开机启动相关服务准备 演示的系统环境:Ubuntu 22.04.3 LTS更新安装/升级docker到最新版本升级docker相关命令如下# 更新软件包列表并自动升级…

没有软件怎么管理固定资产

在当今数字化的世界中,我们已经习惯了使用各种软件来管理我们的日常生活和工作。然而,当我们面临一个看似简单的问题——如何管理固定资产时,我们可能会感到困惑。那么,如果没有软件,我们该如何进行资产管理呢&#xf…

文章生成器免费版

你是否曾经陷入文案创作的困扰中?是不是为了撰写出优质的文章而煞费苦心?那么,如果我告诉你,现在有一种神奇的工具,可以为你解决这个问题,让你轻松地生成文章,你会不会感到兴奋呢?让…

Unity实现用WASD控制一个物体前后左右移动-小白课程01

1 根据业务逻辑搭建场景 02 根据业务写代码 using System.Collections; using System.Collections.Generic; using UnityEngine;//实现让被挂在的物体往前移动 //按下W键往前移动,按下S键往后移动 public class RoleMove : MonoBehaviour { public float myspe…

数据在内存中的存储——练习1

题目: int main() {int a[4] { 1,2,3,4 };int* ptrl (int*)(&a 1);int* ptr2 (int*)((int)a 1);printf("%x,%x",ptr1[-1], *ptr2);return 0; } 思路分析: int* ptrl (int*)(&a 1); ptr1[-1] &a表示的是整个数…

winscope怎么实现user版本上导出方案设计探讨-千里马android framework车载车机手机系统开发

背景 在马哥给讲解怎么用winscope来分析各种闪黑,黑屏等问题后,很多买课的同学都开始使用这个工具用于实际公司的项目了,但是很多同学又开始发现有一个问题,那就发现在user版本的手机设备上发现无法抓取相关的winscope&#xff0…

Qt MinGW / MSVC

MinGW/MSVC的关系 MinGW / MSVC.dll / .lib / .a 的关系 MinGW / MSVC Qt 中有两种方式编译:一种是MinGW ,另一种MSVC,是两种不同的编译器。 MinGW(Minimalist GNUfor Windows),它是一个可自由使用和自由发布的Windows特定头文件…

PMP-项目启动过程组的重要性

一、什么是项目启动过程组 启动过程组包括定义一个新项目或现有项目的一个新阶段,授权开始该项目或阶段的一组过程。启动过程组的目的是:协调相关方期望与项目目的,告知相关方项目范围和目标,并商讨他们对项目及相关阶段的参与将如…

springboot导出(POI)

POI官方文档 引入依赖 <!--POI--><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId&…

Redis——其他数据类型介绍

概要介绍 Redis中有10种不同的数据类型。之前的blog中介绍了Redis中常见的五大数据类型&#xff1a;String&#xff0c;List&#xff0c;Hash&#xff0c;Set&#xff0c;ZSet。而Redis中还有许多其他的数据类型&#xff0c;一般在特定的场景中使用 Stream 首先介绍一下什么…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

C语言数组和指针笔试题(一)(一定要看)

目录 一维数组例题1例题2例题3例题4例题5例题6例题7例题8例题9例题10例题输出结果 字符数组例题1例题2例题3例题4例题5例题6例题7 一维数组 int a[] {1,2,3,4}; 1:printf("%d\n",sizeof(a)); 2:printf("%d\n",sizeof(a0)); 3:printf("%d\n",si…

继续上一个爬虫,所以说selenium加browsermobproxy

继续&#xff0c;书接上回&#xff0c;这次我通过jsrpc&#xff0c;也学会了不少逆向的知识&#xff0c;感觉对于一般的网站应该都能应付了。当然我说的是简单的网站&#xff0c;遇到那些混淆的&#xff0c;还有那种猿人学里面的题目&#xff0c;还是免谈了。那种需要的水平太高…

Linux(Centos7)中安装Docker和DockerCompose

一、安装Docker Docker 分为 CE 和 EE 两大版本。CE 即社区版&#xff08;免费&#xff0c;支持周期 7 个月&#xff09;&#xff0c;EE 即企业版&#xff0c;强调安全&#xff0c;付费使用&#xff0c;支 持周期 24 个月。 Docker CE 分为 stable test 和 nightly 三个更新频…

Mysql高级——存储引擎

存储引擎 1). 连接层 最上层是一些客户端和链接服务&#xff0c;包含本地sock 通信和大多数基于客户端/服务端工具实现的类似于 TCP/IP的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程 池的概念&#xff0c;为通过认证安全接入的客户端提…