上次实现了census变换和计算Hamming距离后,就可以得到像素的二进制编码位串,并对两个编码过的像素(实际上是编码过的位串)进行Hamming距离计算,以计算他们在某种意义上的相似性。有了他俩的帮助,就能进行代价计算和视差计算了。
代价计算
代价计算的默认前提是两副图像已经经过极线矫正了,这样才能使图像尽量达到我们想要的理想情况,即像素只有横向上的位移。代价计算的算法也是基于这个前提的。正是由于有一个横向位移,所以需要指定一个视差范围,在这个视差范围内寻找最为匹配的像素。这里我先搬来了李博的代码,对着代码分析是如何计算代价的。
1 | void SemiGlobalMatching::ComputeCost() const { |
比如指定视差范围为0~64,以左图为基准,使用右图对应位置的像素点以及这一点所在行的前d个像素进行对比,获得第三个维度的64个视差,if (j - d < 0 || j - d >= width_)
用来处理边缘那些超出图像索引范围的像素,给他们赋予灰度中值,从而可以得到一个视差空间图像(DSI):
得到这个视差空间图像后,就可以进行视差计算了:
视差计算
视差计算采用赢家通吃(WTA)算法,很简单的,就是对单个像素的64个代价值求其最小值,作为这个像素点最终的视差值:
1 | void SemiGlobalMatching::ComputeDisparity() const { |
这样就有了一个完整可运行的框架,剩下的就只是优化工作了,运行主函数可以获得实验结果:
1. 【理论恒叨】【立体匹配系列】经典SGM:(4)视差计算、视差优化 ↩
2. 【码上实战】【立体匹配系列】经典SGM:(2)代价计算 ↩