• 【双目视觉】 立体匹配算法原理之“代价空间与聚合、视差计算”


    预备知识

    1. 【双目视觉】 理想条件下计算物体距离_什么都只会一点的博客-CSDN博客
    2. 【双目视觉】 立体匹配算法原理之“代价函数”_什么都只会一点的博客-CSDN博客
    image-20220809154728317

    代价空间

    image-20220809163622579
    C A D ( x , y , d ) = ∣ I L ( x , y ) − I R ( x − d , y ) ∣ C_{A D}(x, y, d)=\left|I_{L}(x, y)-I_{R}(x-d, y)\right| CAD(x,y,d)=IL(x,y)IR(xd,y)
    bandicam-2022-08-09-17-18-53-853

    d是移动像素的大小。以左图为基准。下面以左图的一个像素点P为例

    1. d=0,右图不移动,计算 C A D 0 C_{AD0} CAD0
    2. d=1,右图向右移动一个像素点,再计算 C A D 1 C_{AD1} CAD1
    3. d=2,右图向右移动一个像素点,再计算 C A D 2 C_{AD2} CAD2
    4. …(d++,不断执行)…
    5. 最后得到代价空间

    代价聚合

    🔥目的:对代价空间进行滤波,使边界平滑

    Box Filtering(均值滤波)

    C d A ( p ) = 1 N ∑ q C d ( q ) C_{d}^{A}(p)=\frac{1}{N} \sum_{q} C_{d}(q) CdA(p)=N1qCd(q)

    N:窗口像素个数

    效果:

    image-20220809173051620

    Bilateral filter

    Bilateral filter就是输入的代价,乘以一个高斯函数,实现平滑

    image-20220809173257584

    效果:

    image-20220809173321459

    Cross-based local stereo matching(自适应形状)

    任意选取一个像素点,横向、纵向扩张,直到遇到颜色差异较大的地方才停下来。然后在扩张后的像素点,重复上述操作。这样,因为能及时发现边界,就能大概判断出一整块区域的视差图

    image-20220809173418101

    image-20220809173449486

    🚀Semi-Global Matching

    能量函数
    E ( D ) = ∑ p ( C ( p , D p ) + ∑ q ∈ N p P 1   T [ ∣ D p − D q ∣ = 1 ] + ∑ q ∈ N p P 2   T [ ∣ D p − D q ∣ > 1 ] )

    E(D)=p(C(p,Dp)+qNpP1 T[|DpDq|=1]+qNpP2 T[|DpDq|>1])" role="presentation" style="position: relative;">E(D)=p(C(p,Dp)+qNpP1 T[|DpDq|=1]+qNpP2 T[|DpDq|>1])
    E(D)=p C(p,Dp)+qNpP1 T[DpDq=1]+qNpP2 T[DpDq>1]

    D p − D q = 1 D_p-D_q = 1 DpDq=1时,我们就取 ∑ q ∈ N p P 1   T [ ∣ D p − D q ∣ = 1 ] \sum_{\mathbf{q} \in N_{\mathbf{p}}} P_{1} \mathrm{~T}\left[\left|D_{\mathbf{p}}-D_{\mathbf{q}}\right|=1\right] qNpP1 T[DpDq=1]

    D p − D q > 1 D_p-D_q > 1 DpDq>1,我们就取 ∑ q ∈ N p P 2   T [ ∣ D p − D q ∣ > 1 ] \sum_{\mathbf{q} \in N_{\mathbf{p}}} P_{2} \mathrm{~T}\left[\left|D_{\mathbf{p}}-D_{\mathbf{q}}\right|>1\right] qNpP2 T[DpDq>1]

    优化步骤

    1. 计算代价空间;(AD, BT, Census, MI, ….)

    2. 代价聚合

      方向r上的路径代价
      L r ( p , d ) = C ( p , d ) + min ⁡ ( L r ( p − r , d ) L r ( p − r , d − 1 ) + P 1 L r ( p − r , d + 1 ) + P 1 min ⁡ i L r ( p − r , i ) + P 2 ) − min ⁡ k L r ( p − r , k )

      Lr(p,d)=C(p,d)+min(Lr(pr,d)Lr(pr,d1)+P1Lr(pr,d+1)+P1miniLr(pr,i)+P2)minkLr(pr,k)" role="presentation" style="position: relative;">Lr(p,d)=C(p,d)+min(Lr(pr,d)Lr(pr,d1)+P1Lr(pr,d+1)+P1miniLr(pr,i)+P2)minkLr(pr,k)
      Lr(p,d)=C(p,d)+min(Lr(pr,d)Lr(pr,d1)+P1Lr(pr,d+1)+P1iminLr(pr,i)+P2)kminLr(pr,k)
      当d=0时, L r ( p , d ) = C ( p , d ) − min ⁡ k L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p}, d)= C(\mathbf{p}, d)-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) Lr(p,d)=C(p,d)minkLr(pr,k)

      当|d|=1时, L r ( p , d ) = C ( p , d ) + P 1 − min ⁡ k L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p}, d)= C(\mathbf{p}, d)+P_1-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) Lr(p,d)=C(p,d)+P1minkLr(pr,k)

      当|d|=i时, L r ( p , d ) = C ( p , d ) + P 2 − min ⁡ k L r ( p − r , k ) L_{\mathbf{r}}(\mathbf{p}, d)= C(\mathbf{p}, d)+P_2-\min _{k} L_{\mathbf{r}}(\mathbf{p}-\mathbf{r}, k) Lr(p,d)=C(p,d)+P2minkLr(pr,k)

      L r ( p − r , d ) L_r(p-r,d) Lr(pr,d)是该像素点左侧,最优代价。即当d=i时,左侧有最优代价,那么就 C ( p , d ) + P 2 C(\mathbf{p}, d)+P_2 C(p,d)+P2

      各个方向的总聚合代价
      S ( p , d ) = ∑ L r ( p , d ) S(\mathbf{p}, d)=\sum L_{\mathbf{r}}(\mathbf{p}, d) S(p,d)=Lr(p,d)
      例如opencv收录的sgbm算法,就是计算了下面5条路径的代价

      屏幕截图 2022-08-10 093643

    3. WTA

      Winner-Take-All,赢家通吃

      即我们发现在这条视差方向r上,纵轴(聚合后的代价)最小,那么我们就取出视差值(d=18)

      image-20220810095720836

    4. 视差后处理

  • 相关阅读:
    类的成员之二:方法(method)
    vr模拟电力场景安全应急培训,电力安全教育培训新方法
    linux内核调试工具之kprobe(二)
    Javaweb之javascript的详细解析
    使用spring-ai快速对接ChatGpt
    java学习--day8 (面向对象)
    使用Postman调试API遇到“400 Bad Request”问题
    vue面试相关知识
    订阅发布和请求响应都是消息传递模式
    VM16中安装CentOS7.4保姆级教程
  • 原文地址:https://blog.csdn.net/henghuizan2771/article/details/126260760