立体匹配的问题及基本解决思路与流程

参考

一文详解三维重建中的立体匹配

1.立体匹配的困难之处

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.基本解决思路

2.1 图像预处理 Preprocess

如果是因为两幅图像的亮度、噪声不一致,一般会先对图像做预处理,使得两幅图像的整体质量区域一致。

经典方法有:

  1. 对图像做滤波操作去除图像中的噪声,比如高斯拉普拉斯滤波和双边滤波等
  2. 对图像亮度做归一化操作,比如减去领域的均值
  3. 对图像做特征变换,提取图像中不变的特征供后续处理,如Census变换

2.2 代价计算 Cost Computation

若计算同名点匹配代价时采用的是单个像素点的绝对值的差异,很容易受到噪声的干扰。

规避方法有二:

  1. 换用更鲁棒的单像素的代价函数
  2. 采用邻域支持窗来计算整体代价

下面细说。

1.换用更鲁棒的单像素的代价函数

如像素差异绝对值 Absolute Differences,平方差 Squared Differences,截断绝对差 Truncated Absolute Differences (TAD),

2.采用邻域支持窗来计算整体代价

仅仅考虑单个像素,还是很难得到好的结果。

更好的方式是通过计算所关注的像素点的邻域的整体情况,来提升信噪比,减少噪声的影响。我们把这个邻域范围称为“支持窗(Support Window)”,通过支持窗内所有像素来计算一个匹配代价值。

这种策略就是把单个像素的计算转换为一个支持窗内的整体计算了。

如:像素绝对差值和 Sum of Absolute differences (SAD),像素差值平方和Sum of Squared differences (SSD),截断绝对差值和 Sum of truncated absolute differences (STAD)。

除了这些简单的代价函数,还有更多方法,比如利用两个图像的互相关信息的,利用图像梯度域信息的,或是利用一些非参数方法的,等等。

总之,我们可以为R中的每个像素点和选定的T中的像素点计算一个代价,并且这个代价还具有很高的区分度。

是在一个范围[dmin, dmax]中搜索匹配点,因此对任何一个R中的像素点,可以算出dmax - dmin + 1种代价值。如果图像的宽高分别为W和H,那么我们总共会得到W x H x (dmax - dmin + 1)种代价值。所有这些代价值可以存储到一个立方体中,这就是所谓的代价立方体。

在这里插入图片描述

2.3 代价聚合(Cost Aggregation)和视差优化(Disparity Optimization)

通过支持窗计算代价已经对图像的噪声、光照不一致等等提升了一定的鲁棒性,但依然有很多问题遗留下来。

比起最基础的方案,视差图似乎平滑了很多,没有了大片的噪声。但是很多局部是错误的。

固定支持窗,英文是Fixed Window,简称FW。上述结果不够理想,是因为FW策略违背了一些基础假设。

  1. FW假设支持窗是正对相机的平面,支持窗内的所有点的视差是一致的,这显然和实际情况不一样。
  2. 支持窗忽略了窗口内深度不连续,甚至有突变的情况,而强行把窗口内的视差值加权平均到一起。这就会导致产生的视差图内出现大量的物体边缘错误。
  3. 当场景中有大面积的重复纹理、无纹理的部分时,小尺寸的支持窗无法解决同名点计算错误的问题,这种情况下可能出现很多候选像素点的代价值都一样,难以区分的情况。

尽管固定支持窗有这样那样的缺点,但它理解和实现都很容易,且非常便于并行化,在现代处理器上也比较容易做到实时运行,非常容易采用FPGA这样的硬件进行实现,性价比很足!所以很多传统算法的代价计算这一步都是采用固定大小支持窗来完成的。而要继续提升最终算法的效果,还得靠后续的步骤。

主要有两大类思路,也就是局部聚合思路,和全局优化思路。

2.3.1. 代价聚合(Cost Aggregation)

局部聚合思路通过对代价立方体中同一视差的代价进行某种程度的聚合,来减少或消除错误代价的影响,这一步就是所谓的代价聚合(Cost Aggregation)。

同一个视差的窗口我们会扩大并将代价立方体中相应的代价聚合在一起。

一般来说是通过调整支持窗的位置、形状、窗内各像素的权重等等来完成聚合的。

2.3.2 视差优化(Disparity Optimization)

全局优化思路,则是希望寻找到每个像素的最优视差结果,使得全局的、整体的匹配代价最小,这一步被称为视差优化(Disparity Optimization)。

这个过程就变成了一个最优化某个能量函数的过程,该函数通常写成如下的形式:
在这里插入图片描述
等号右边第1项是数据项,用于约束全局代价最小化。

但是代价立方体中通常含有噪声和错误,直接最小化求得的结果也会有很多问题,所以还需要第2项平滑项。这一项一般用于给出某些额外的约束条件,比如通常假设整个图像的视差是平滑变化的。这样视差的大变化只会在场景内视差边缘处产生,一般也和图像内物体边缘高度相关。

如:图割法、置信度传播法、动态规划法等

2.4 视差后处理(Disparity Refinement)

前面介绍的步骤最终将输出一张视差图,然而正如你已经看到的,即便是在上面那些受约束的场景,得到的视差图依然不是完美的,还是有很多错误。

因此,还需要一个后处理的步骤,来消除其中的错误,得到更准确的视差图。

在这里插入图片描述
需要解决的问题有:

  1. 亚像素插值:我们上面计算的视差值都是离散的整数值,但实际场景物体存在连续变化的视差,我们希望得到以浮点数表示的更精细的视差值。一般来说,会采用某种二次的抛物线插值法,得到连续的视差值,计算量也比较低,结果也不错。
  2. 噪声和错误消除:有时候会简单采用图像滤波的技术来处理视差图,也能得到不错的结果。从简单的中值滤波,到复杂的双边滤波都有人尝试。另外一个重要的技巧是双向匹配,这种方法分别以双目图像中左图和右图作为参考图像R计算两个视差图(缺点:增加了计算量)。然后它认为一对匹配点的视差值是互反的,也就是说一对正确匹配点的视差值会非常接近。如果不满足这个条件那么对应的视差值应该就是错误的。

3. 如何确定视差范围

在这里插入图片描述
在这里插入图片描述

### 双目立体匹配在FPGA上的实现 #### 方案概述 双目立体匹配是一种通过两个摄像头获取同一场景的不同视角图像来重建三维信息的技术。对于该技术,在FPGA上实现实时高效处理具有显著优势。具体来说,可以利用FPGA并行计算能力强的特点加速特征提取、代价计算、视差估计等过程。 #### 关键模块设计 1. **图像预处理** 图像预处理阶段主要负责对来自两台摄像机的原始RGB图像做初步调整,比如灰度化转换、噪声去除等操作。这一步骤有助于提高后续匹配精度[^1]。 2. **窗口滑动相似性度量** 基于局部方法构建固定大小的窗口沿水平方向逐像素移动,采用SSD (Sum of Squared Differences) 或者 NCC(Normalized Cross Correlation) 计算左右眼间对应位置差异程度作为匹配成本函数值。 3. **聚合策略** 考虑到单点测量可能存在误差,因此引入上下文信息辅助决策机制——即通过对邻近区域内的多个候选解加权求平均得到更可靠的最终结果。 4. **视差优化** 应用半全局块匹配(Semi-Global Block Matching, SGBM)算法进一步改善边界连续性和抗噪性能;同时结合亚像素级插值得到更高分辨率的地图输出。 5. **硬件资源分配** 鉴于FPGA内部逻辑单元数量有限,需合理规划各功能区块占用比例,确保整体吞吐率最大化的同时兼顾功耗控制需求。 ```verilog // Verilog代码片段展示部分核心运算电路的设计思路 module disparity_computation ( input wire clk, input wire rst_n, // ...其他信号声明... ); always @(posedge clk or negedge rst_n) begin : proc_state_machine if (!rst_n) state <= IDLE; else case(state) IDLE: begin if(start_flag) state <= COMPUTE_DISPARITY; end COMPUTE_DISPARITY: begin // 执行具体的视差计算流程 // ... if(complete_flag) state <= OUTPUT_RESULT; end default: ; endcase end // 更多细节省略... endmodule ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值