BM立体匹配算法的参数详解

合集下载

OpenCV3.4两种立体匹配算法效果对比

OpenCV3.4两种立体匹配算法效果对比

OpenCV3.4两种⽴体匹配算法效果对⽐以OpenCV⾃带的Aloe图像对为例:1.BM算法(Block Matching)参数设置如下:int numberOfDisparities = ((imgSize.width / 8) + 15) & -16;cv::Ptr<cv::StereoBM> bm = cv::StereoBM::create(16, 9);cv::Rect roi1, roi2;bm->setROI1(roi1);bm->setROI2(roi2);bm->setPreFilterCap(31);bm->setBlockSize(9);bm->setMinDisparity(0);bm->setNumDisparities(numberOfDisparities);bm->setTextureThreshold(10);bm->setUniquenessRatio(15);bm->setSpeckleWindowSize(100);bm->setSpeckleRange(32);bm->setDisp12MaxDiff(1);bm->compute(imgL, imgR, disp);效果如下:BM算法得到的视差图(左),空洞填充后得到的视差图(右)2.SGBM(Semi-Global Block matching)算法:参数设置如下:enum { STEREO_BM = 0, STEREO_SGBM = 1, STEREO_HH = 2, STEREO_VAR = 3, STEREO_3WAY = 4 };int numberOfDisparities = ((imgSize.width / 8) + 15) & -16;cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create(0, 16, 3);sgbm->setPreFilterCap(63);int SADWindowSize = 9;int sgbmWinSize = SADWindowSize > 0 ? SADWindowSize : 3;sgbm->setBlockSize(sgbmWinSize);int cn = imgL.channels();sgbm->setP1(8 * cn*sgbmWinSize*sgbmWinSize);sgbm->setP2(32 * cn*sgbmWinSize*sgbmWinSize);sgbm->setMinDisparity(0);sgbm->setNumDisparities(numberOfDisparities);sgbm->setUniquenessRatio(10);sgbm->setSpeckleWindowSize(100);sgbm->setSpeckleRange(32);sgbm->setDisp12MaxDiff(1);int alg = STEREO_SGBM;if (alg == STEREO_HH)sgbm->setMode(cv::StereoSGBM::MODE_HH);else if (alg == STEREO_SGBM)sgbm->setMode(cv::StereoSGBM::MODE_SGBM);else if (alg == STEREO_3WAY)sgbm->setMode(cv::StereoSGBM::MODE_SGBM_3WAY);sgbm->compute(imgL, imgR, disp);效果如图:SGBM算法得到的视差图(左),空洞填充后得到的视差图(右)可见SGBM算法得到的视差图相⽐于BM算法来说,减少了很多不准确的匹配点,尤其是在深度不连续区域,速度上SGBM要慢于BM算法。

BM算法详解

BM算法详解

BM算法详解BM算法 后缀匹配,是指模式串的⽐较从右到左,模式串的移动也是从左到右的匹配过程,经典的BM算法其实是对后缀蛮⼒匹配算法的改进。

为了实现更快移动模式串,BM算法定义了两个规则,好后缀规则和坏字符规则,如下图可以清晰的看出他们的含义。

利⽤好后缀和坏字符可以⼤⼤加快模式串的移动距离,不是简单的++j,⽽是j+=max (shift(好后缀), shift(坏字符)) 先来看如何根据坏字符来移动模式串,shift(坏字符)分为两种情况:坏字符没出现在模式串中,这时可以把模式串移动到坏字符的下⼀个字符,继续⽐较,如下图:坏字符出现在模式串中,这时可以把模式串第⼀个出现的坏字符和母串的坏字符对齐,当然,这样可能造成模式串倒退移动,如下图: 此处配的图是不准确的,因为显然加粗的那个b并不是”最靠右的”b。

⽽且也与下⾯给出的代码冲突!我看了论⽂,论⽂的意思是最右边的。

当然了,尽管⼀时⼤意图配错了,论述还是没有问题的,我们可以把图改正⼀下,把圈圈中的b改为字母f就好了。

接下来的图就不再更改了,⼤家⼼⾥有数就好。

为了⽤代码来描述上述的两种情况,设计⼀个数组bmBc['k'],表⽰坏字符‘k’在模式串中出现的位置距离模式串末尾的最⼤长度,那么当遇到坏字符的时候,模式串可以移动距离为: shift(坏字符) = bmBc[T[i]]-(m-1-i)。

如下图: 数组bmBc的创建⾮常简单,直接贴出代码如下:1 void preBmBc(char *x, int m, int bmBc[]) {23 int i;45 for (i = 0; i < ASIZE; ++i)67 bmBc[i] = m;89 for (i = 0; i <= m - 1; ++i)1011 bmBc[x[i]] = m - i - 1;1213 } 代码分析:ASIZE是指字符种类个数,为了⽅便起见,就直接把ASCII表中的256个字符全表⽰了,哈哈,这样就不会漏掉哪个字符了。

BM算法-专业文档

BM算法-专业文档

BM算法BM算法,即Boyer-Moore算法,是一种被广泛应用于字符串匹配的算法。

它由Robert S. Boyer和J Strother Moore于1977年提出,并在一些文本搜索和字符串匹配的应用中表现出优异的性能。

下面将对BM算法进行详细的介绍。

一、算法概述BM算法是一种自底向上的字符串匹配算法,它通过构建坏字符规则和好后缀规则来决定模式串的移动距离。

相比于朴素的字符串匹配算法,BM算法在匹配失败时能够根据模式串和文本串的已知信息进行跳跃,从而提高了匹配的效率。

二、坏字符规则坏字符规则是指当模式串与文本串的某个字符不匹配时,我们可以根据这个不匹配的字符来确定模式串应该向右移动的距离。

为了实现这个规则,我们需要预先构建一个坏字符表,其中记录了每个字符在模式串中最后一次出现的位置。

当发生不匹配时,我们可以直接将模式串向右移动到坏字符表中对应字符的位置。

三、好后缀规则好后缀规则是指当模式串与文本串的后缀部分匹配成功时,我们可以根据这个好后缀来确定模式串应该向右移动的距离。

为了实现这个规则,我们需要预先构建一个前缀表和后缀表,其中记录了每个前缀或后缀在模式串中第一次出现的位置。

当发生匹配时,我们可以根据前缀表和后缀表中的信息来确定模式串应该向右移动的距离。

四、算法步骤1.预处理阶段:构建坏字符表和前缀表、后缀表。

2.匹配阶段:从左到右依次比较模式串和文本串的字符。

3.如果发生不匹配:根据坏字符规则将模式串向右移动相应的距离。

4.如果匹配成功:根据好后缀规则将模式串向右移动相应的距离。

5.重复步骤2-4直到模式串移动到文本串的末尾位置。

五、算法性能分析BM算法的时间复杂度为O(n),其中n为文本串的长度。

在最好的情况下,BM 算法的时间复杂度可以达到O(n/m),其中m为模式串的长度。

相比于朴素的字符串匹配算法,BM算法在处理较长的文本串时具有更好的性能表现。

六、总结BM算法是一种经典的字符串匹配算法,它通过结合坏字符规则和好后缀规则来实现高效的字符串匹配。

基于sgbm算法与bm算法的三维重建分析

基于sgbm算法与bm算法的三维重建分析
1 三维重建基础理论
双目立体视觉系统中相机的放置模式有会聚式 和平行式 2 种。本文 2 部相机采用平行式工作模式。 该模式下的相机光轴相互平行,且在同一水平高度上, 成像平面平行共面,也被称为标准式[1]。
平行式双目立体视觉系统模型如图 2 所示。2 部
1.1 双目立体视觉原理
相机的参数相同:b 是基线;OL、OR 分别为左右相机
2019 年 第 40 卷 第 5 期 自动化与信息工程 7
算法决定了匹配结果的速度和视差图的精确度。本文 分别采用 SGBM 算法和 BM 算法进行立体匹配计算, 得到 2 种算法的深度输出图并进行对比分析。
点 P,q 之间的平滑度约束函数;P1 和 P2 分别表示视
差差值为 1 和视差差值大于 1 的惩罚系数,一般 P1<P2。
关键词:SGBM 算法;BM 算法;双目立体视觉;三维重建;立体匹配
0 引言
双目立体视觉是机器视觉的重要分支,在航天航 空、人脸识别、生物医学等领域应用广泛[1]。基于双 目立体视觉的三维重建是利用双目相机获取具有二 维信息的图片对,再通过立体匹配算法计算得到三维 结构信息的过程。其主要工作包括 5 个方面:图像采
其中核心步骤为立体匹配根据左右相机获取的两幅图像建立周围环境中的物体在两幅图像间投影点的对应关系并由立体几何原理计算出投影点的视差从而得到最终的视差图2
论文
基于 SGBM 算法与 BM 算法的三维重建分析
李先祥 1 陈思琪 1 肖红军 1 黄道平 2
(1.佛山科学技术学院 2.华南理工大学) 摘要:立体匹配是双目立体视觉三维重建的重要部分,其算法的选用直接影响匹配的效率与重建结果的准
相机模型获取的物体在真实世界的三维信息需 关联到 4 个坐标系以及对应的相机模型。4 个坐标系 分别是世界坐标系、相机坐标系、图像坐标系和像素 坐标系。坐标间转换关系如图 1 所示。利用坐标间的 转换关系可由已知的二维信息得到物体的三维坐标 信息。

块匹配算法 bm3d算法的原理

块匹配算法 bm3d算法的原理

块匹配算法 bm3d算法的原理bm3d算法是一种用于图像去噪的块匹配算法,它具有高效、准确的特点。

本文将详细介绍bm3d算法的原理和实现过程。

一、引言图像去噪是图像处理中的一项重要任务,在图像采集和传输过程中,常常会受到噪声的干扰,导致图像质量下降。

因此,开发一种高效的图像去噪算法对于提升图像质量具有重要意义。

bm3d算法是一种基于块匹配的图像去噪算法,通过将图像分成若干个块,并在每个块内进行自适应的块匹配和块滤波,从而实现图像去噪的目的。

二、原理介绍1. 块划分将待去噪的图像分成大小相同的块,每个块包含一定数量的像素点。

这里使用非重叠的块划分方式,即每个块之间没有重叠的像素点。

2. 块匹配对于每个块,将其与图像中所有其他块进行匹配,找出与之最相似的一组块。

这里使用块匹配算法来寻找相似的块,常用的块匹配算法有均方差匹配、相关系数匹配等。

3. 3D变换将匹配到的相似块按照一定的方式进行3D变换,将其表示为一组3D数据。

这样可以提取出块内的结构信息,便于后续的块滤波操作。

4. 块滤波对于每个块,利用其相似块的3D数据进行块滤波操作,即对3D 数据进行滤波,得到去噪后的3D数据。

常用的块滤波方法有硬阈值滤波、软阈值滤波等。

5. 逆3D变换将去噪后的3D数据进行逆3D变换,得到去噪后的块。

6. 块合并将所有去噪后的块合并起来,得到最终的去噪图像。

三、算法流程1. 输入待去噪的图像。

2. 对图像进行块划分,得到一组块。

3. 对每个块进行块匹配,找出相似的块。

4. 对匹配到的相似块进行3D变换,得到一组3D数据。

5. 对每个块的3D数据进行块滤波,得到去噪后的3D数据。

6. 对去噪后的3D数据进行逆3D变换,得到去噪后的块。

7. 将所有去噪后的块合并起来,得到最终的去噪图像。

8. 输出去噪后的图像。

四、实验结果bm3d算法在图像去噪方面取得了较好的效果。

通过实验证明,与传统的去噪算法相比,bm3d算法在保持图像细节的同时,有效地去除了噪声,提升了图像质量。

BM算法讲解

BM算法讲解

由于毕业设计(入侵检测)的需要,这两天仔细研究了BM模式匹配算法,稍有心得,特此记下。

首先,先简单说明一下有关BM算法的一些基本概念。

BM算法是一种精确字符串匹配算法(区别于模糊匹配)。

BM算法采用从右向左比较的方法,同时应用到了两种启发式规则,即坏字符规则和好后缀规则,来决定向右跳跃的距离。

BM算法的基本流程: 设文本串T,模式串为P。

首先将T与P进行左对齐,然后进行从右向左比较,如下图所示:若是某趟比较不匹配时,BM算法就采用两条启发式规则,即坏字符规则和好后缀规则,来计算模式串向右移动的距离,直到整个匹配过程的结束。

下面,来详细介绍一下坏字符规则和好后缀规则。

首先,诠释一下坏字符和好后缀的概念。

请看下图:图中,第一个不匹配的字符(红色部分)为坏字符,已匹配部分(绿色)为好后缀。

1)坏字符规则(Bad Character):在BM算法从右向左扫描的过程中,若发现某个字符x不匹配,则按如下两种情况讨论:i. 如果字符x在模式P中没有出现,那么从字符x开始的m个文本显然不可能与P匹配成功,直接全部跳过该区域即可。

ii. 如果x在模式P中出现,则以该字符进行对齐。

用数学公式表示,设Skip(x)为P右移的距离,m为模式串P的长度,max(x)为字符x在P中最右位置。

例1:下图红色部分,发生了一次不匹配。

计算移动距离Skip(c) = 5 - 3 = 2,则P向右移动2位。

移动后如下图:2)好后缀规则(Good Suffix):若发现某个字符不匹配的同时,已有部分字符匹配成功,则按如下两种情况讨论:i. 如果在P中位置t处已匹配部分P'在P中的某位置t'也出现,且位置t'的前一个字符与位置t的前一个字符不相同,则将P右移使t'对应t方才的所在的位置。

ii. 如果在P中任何位置已匹配部分P'都没有再出现,则找到与P'的后缀P''相同的P的最长前缀x,向右移动P,使x对应方才P''后缀所在的位置。

BM算法详解

BM算法详解

BM算法详解来源在没有BM算法时,其原始算法是从后往前进⾏匹配,需要两层循环,判断以某个字符为结尾的⼦串是否和模式串相等,这种算法也称作暴搜;贴上代码:void BLS(string s, string p) {int s_len = s.size(), p_len = p.size();int j = 0, i = 0;while (j <= s_len - p_len) {for (i = p_len - 1; i >= 0 && p[i] == s[i + j]; --i) {}if (i < 0) {cout << "match: " << i + j + 1 << endl;j += p_len;}elsej++;}}算法的思想还是⽐较容易理解的,i和j分别指的是,模式串中已经匹配的位数,模式串相对于原串移动的位数;移动规则算法包含了两个重要的内容,分别是好后缀和坏字符的规则;坏字符:当模式串和原串的字符并不匹配时,原串中的字符就称为坏字符;好后缀:模式串和原串的字符相等时所有的字符串,⽐如ABCD和BCD,那么它的好后缀则包括第⼀次匹配的D,和第⼆次匹配的CD,还有第三次的BCD;例⼦:BM算法的向右移动模式串的距离就是取坏字符和好后缀算法得到的最⼤值;这两个内容分别拥有着⼏条规则,需要注意:坏字符1. 坏字符没出现在模式串中,这时可以把模式串移动到坏字符的下⼀个位置,继续⽐较;⽐如说,ABC和D,其中D和A对齐,因为不匹配,所以D会移动到和B对齐;2. 坏字符出现在模式串中,这时可以把模式串中第⼀个出现(从后往前数第⼀个出现,也就是从前往后数,最靠右出现的)的坏字符和原串的坏字符对齐;⽐如说,BCCBCAD和AAD,假如其中AAD和BCC对齐,发现D和C⽆法匹配,移动到和BCA匹配,此时同样不匹配,但是A存在于模式串中,所以移动到模式串中坏字符出现的上⼀次位置,也就是向后移⼀位,和CAD对齐;当⾸次⽐较就⽆法匹配时,那么肯定是运⽤坏字符规则,因为并不存在好后缀;所以我们发现坏字符的移动规则公式为:后移位数=坏字符的位置-模式串中的上⼀次出现位置那⽤代码表⽰则是void preBmBc(string x, vector<int>& bmBc) {int i = 0;int len = (int)x.size();// 全部更新为⾃⼰的长度for (i = 0; i < ASIZE; ++i) {bmBc[i] = len;}// 计算字符串中每个字符距离字符串尾部的长度for (i = 0; i < x.size() - 1; ++i) {bmBc[x[i]] = len - i - 1;}}⾸先应该知道的是,bmBc存储的是坏字符出现的位置距离模式串末尾的最⼤长度;前⼀个循环⽤来处理第⼀种规则,因为遇见不匹配时,直接移动模式串的长度;后⼀个循环处理第⼆种规则,需要注意的是,因为要保证最靠右原则,所以要从头开始循环,从⽽使得当遇见相同的字符,后者可以将前者进⾏覆盖。

立体匹配算法指标

立体匹配算法指标

立体匹配算法指标立体匹配算法是一种用于计算机视觉中的重要技术,它可以通过分析图像中的特征点和深度信息来实现图像的立体重建和三维场景的恢复。

在立体匹配算法中,评价算法的指标是十分重要的,可以用来衡量算法的准确性、鲁棒性和效率等方面。

本文将介绍几个常用的立体匹配算法指标,并对其进行详细的解释和分析。

一、视差误差视差误差是衡量立体匹配算法准确性的重要指标之一。

视差是指左右图像中对应像素点之间的水平偏移量,视差误差则是算法计算得到的视差值与真实值之间的差异。

视差误差可以通过计算平均绝对误差(MAE)或均方根误差(RMSE)得到,较小的视差误差代表算法的准确性较高。

二、匹配正确率匹配正确率是衡量立体匹配算法鲁棒性的指标之一。

它表示算法成功找到了正确的匹配点的比例。

匹配正确率可以通过计算正确匹配点的数量与总匹配点数的比值得到,较高的匹配正确率代表算法对噪声和变化较鲁棒。

三、计算时间计算时间是衡量立体匹配算法效率的指标之一。

立体匹配算法需要对图像进行特征提取、匹配计算等复杂操作,因此算法的计算时间直接影响到实时性和实用性。

通常使用算法的平均运行时间或计算复杂度来评估算法的计算效率,较短的计算时间代表算法的效率较高。

四、稠密度稠密度是衡量立体匹配算法完整性的指标之一。

它表示算法成功计算出的视差值的比例。

立体匹配算法的目标是计算图像中所有像素点的视差值,较高的稠密度代表算法对整个图像的处理能力较强。

五、误匹配率误匹配率是衡量立体匹配算法鲁棒性的指标之一。

它表示算法错误匹配的点的比例。

误匹配率可以通过计算错误匹配点的数量与总匹配点数的比值得到,较低的误匹配率代表算法对噪声和变化较鲁棒。

六、可扩展性可扩展性是衡量立体匹配算法适应性的指标之一。

它表示算法在处理不同场景和不同图像时的表现能力。

立体匹配算法需要具备一定的适应性,能够处理复杂场景、光照变化、纹理缺乏等情况,并保持较好的准确性和鲁棒性。

七、内存占用内存占用是衡量立体匹配算法资源消耗的指标之一。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

BM立体匹配算法的参数详解
1. 最小视差(Minimum Disparity):表示在计算深度图时允许的最
小视差值,即物体最近处的深度差异。

选择合适的最小视差值对于过滤无
意义的区域非常重要。

2. 最大视差(Maximum Disparity):表示在计算深度图时允许的最
大视差值,即物体最远处的深度差异。

选择合适的最大视差值可以防止视
差计算的误差。

3. 视差窗口大小(Disparity Window Size):表示计算每个像素的
视差时,使用的窗口大小。

较大的窗口尺寸可以提供更准确的深度信息,
但也会增加计算时间。

通常情况下,窗口大小是一个奇数,最常见的是3、5或7
4. 匹配代价度量(Matching Cost Metric):用于计算两个像素之
间的匹配代价的度量方法。

最常见的度量方法是灰度差异和绝对差异,也
可以根据特定的应用选择适当的度量方法。

5. 匹配代价聚合(Matching Cost Aggregation):用于减少匹配代
价图像中的噪声和不一致性的技术。

常用的方法包括平均代价和双边滤波。

6. 视差图优化(Disparity Map Optimization):通过优化视差图像,减少错误匹配和噪声,并提高深度估计的准确性。

常用的方法包括视
差图扩张、视差图填充和视差图平滑。

7. 左右一致性检查(Left-Right Consistency Check):用于消除
左右图像之间不一致匹配的误差。

该步骤通过检查左右视图之间的匹配来
得到更准确的视差图。

8. 剔除无效区域(Invalid Region Exclusion):根据特定应用需求,去除由于遮挡、反射等原因导致的无效区域。

可以使用其他传感器信息或额外的图像处理技术来实现。

9. 空洞填充(Occlusion Filling):通过使用图像分割或插值算法填充由遮挡产生的空洞。

这可以提供更完整和连贯的深度图像。

10. 算法效率(Algorithm Efficiency):BM算法的计算效率对于实时应用很重要。

可以通过多线程计算、算法优化和硬件加速等方法提高算法的效率。

以上是BM立体匹配算法的主要参数详解,通过调整这些参数,可以获得更精确和可靠的深度估计结果,但也需要根据具体应用需求进行参数选择和调整。

相关文档
最新文档