BM算法和SGBM算法优缺点
时间: 2023-11-18 18:54:59 浏览: 448
BM算法和SGBM算法都是用于双目视觉中的立体匹配算法,它们各有优缺点。
BM算法(Block Matching Algorithm)是一种基于区域匹配的算法,它将左右两幅图像分成若干个块,然后在每个块内进行匹配。BM算法的优点是计算速度快,适用于实时性要求较高的场景。缺点是对于纹理较少或者光照变化较大的区域,匹配效果不佳。
SGBM算法(Semi-Global Block Matching Algorithm)是一种全局优化的算法,它考虑了整个图像的信息,通过全局优化来得到更准确的匹配结果。SGBM算法的优点是匹配效果较好,对于纹理较少或者光照变化较大的区域也能得到较好的匹配结果。缺点是计算速度较慢,适用于实时性要求不高的场景。
综上所述,BM算法适用于实时性要求较高的场景,而SGBM算法适用于匹配效果要求较高的场景。在实际应用中,可以根据具体场景的需求选择合适的算法。
相关问题
OpenCV BM算法和SGBM算法
有什么区别?
OpenCV BM算法和SGBM算法都是用于立体视觉的算法,但是它们的实现方式不同。BM算法是基于区域匹配的,它将左右两个图像分成若干个区域,然后对每个区域进行匹配。而SGBM算法则是基于像素点的匹配,它通过计算每个像素点的代价来进行匹配。此外,SGBM算法还可以使用更多的代价计算方式,比如视差梯度等,因此在一些情况下,SGBM算法的效果可能会更好。
BM 算法、SGBM 算法、GC 算法各项参数
### BM 算法参数详解
BM(Block Matching)算法是双目立体视觉中最基础的视差计算方法之一。其主要参数及其含义如下:
- **`blockSize`**: 定义匹配窗口大小,即每次比较时使用的像素块尺寸。较大的 `blockSize` 能够提供更稳定的匹配结果,但也可能导致细节丢失[^2]。
- **`preFilterType`**: 预滤波器类型的选择,默认为 `CV_STEREO_BM_XSOBEL`,表示使用 X 方向 Sobel 滤波来增强边缘特征。
- **`preFilterSize`**: 预处理阶段应用的滤波器核大小,通常建议设置为奇数以获得更好的平滑效果。
- **`preFilterCap`**: 控制预过滤后的最大差异值,用于减少噪声影响并提高鲁棒性。
- **`minDisparity`**: 设置最小可能的视差值,通常设为0或负值以便覆盖近距离物体。
- **`numDisparities`**: 表示搜索范围内的视差数量,必须是16的整数倍。更大的数值意味着更高的精度但会增加计算成本。
- **`textureThreshold`**: 像素区域纹理阈值,低于此值则认为该区域缺乏足够的纹理信息而被忽略。
- **`uniquenessRatio`**: 匹配唯一性比率,确保最佳匹配与其他候选之间的显著差距。
```cpp
cv::StereoBM bm;
bm.setBlockSize(9); // blockSize 参数配置
```
---
### SGBM 算法参数说明
SGBM(Semi-Global Block Matching)是在 BM 的基础上改进的一种半全局优化算法,能够更好地平衡性能与质量。以下是其核心参数及解释:
- **`minDisparity`**: 和 BM 类似,定义了视差图中允许的最低视差值[^4]。
- **`numDisparities`**: 同样需为16的倍数,指定视差搜索的最大范围。
- **`blockSize`**: 对应于局部窗口大小,决定每一步计算所涉及的像素数目。
- **`P1`, `P2`**: 这两个参数控制惩罚项权重,其中 P1 是相邻像素间较小误差的成本,P2 则针对较大误差。合理调整这两个值有助于改善边界清晰度和整体一致性。
- **`disp12MaxDiff`**: 左右图像视差的一致性检查容忍度,超出设定值的部分会被标记为无效。
- **`preFilterCap`**: 功能类似于 BM 中的作用,限制输入数据的变化幅度从而降低噪音干扰。
- **`uniquenessRatio`**, **`speckleWindowSize`**, **`speckleRange`**: 提供额外的后处理选项,分别负责抑制错误匹配、去除孤立的小斑点等操作。
```cpp
cv::Ptr<cv::StereoSGBM> sgbm = cv::StereoSGBM::create(
0, // minDisparity
128, // numDisparities
7 // blockSize
);
sgbm->setP1(216); // P1 参数配置
sgbm->setP2(864); // P2 参数配置
```
---
### GC 算法各项参数介绍
GC(Graph Cut)是一种基于能量最小化的全局最优求解技术,适用于复杂场景下的高精度需求。虽然其实现较为耗时,但在某些特定条件下表现优异。下面是几个重要参数描述:
- **`iterations`**: 图割迭代次数,更多次迭代理论上可以获得更加精确的结果,不过也会相应延长运行时间[^3]。
- **`lambda`**: 平滑因子,调节邻域约束强度,较高的 lambda 更倾向于保持连续性和光滑性。
- **`occlusionCost`**: 处理遮挡情况时引入的一个代价系数,用来权衡可见部分与不可见部分之间关系。
- **`dataTermWeight`**: 数据项权重,反映原始观测值的重要性程度,适当增大可以提升对真实结构还原能力。
由于 OpenCV 自带版本并未完全开放所有高级功能接口给用户自定义调优,因此如果希望深入探索这些超参的影响,则需要借助第三方扩展或者自己动手实现完整的框架逻辑。
---
#### 性能对比总结表
| 参数名称 | BM | SGBM | GC |
|------------------|-----------------------------|-----------------------------|----------------------------|
| 计算效率 | 最高效 | 较低 | 显著较低 |
| 结果准确性 | 较差 | 较好 | 最佳 |
| 是否支持多方向路径优化 | 不支持 | 支持 | 支持 |
---
阅读全文
相关推荐














