双目测距的理论原理 - yubo105139/paper GitHub Wiki

[[TOC]]

双目测距的流程:相机标定、图像矫正、立体匹配和三维重建。

相机标定:单目标定->双目标定

图像矫正:将单目标定的结果带入到双目标定中进行极线矫正。从而获得更加精确对的极线矫正图。

立体匹配:通过获取的极线矫正图,利用极线约束,对对应特征点进行匹配,然后计算出视差图。

三维重建:通过获取的视差图,进行深度计算。

1 相机标定

1.1 图像关键点检测

1.1.1 物理层面

  • 首先需要标定板,标定板的设置要求:目标点能够方便在图像亚像素级的精确定位。(图像目标点越精确,标定结果越好)
  • 相机能更加精确的拍摄标定板图像。(对反光的处理)
  • 相机固定拍摄运行图片,或者图像固定运动相机拍摄图片。从而构建出M幅图(M=15-20幅左右),每幅图N个目标点(避免横向标志点个数与纵向标志点个数相同)。且图像中标定板占整幅图像的$\frac{1}{4}$​左右,另外应使相机视野内不同位置上都进行标定板放置,然后分别拍摄图片,使得标定板落到整个画幅空间。

1.1.2 图像检测

  • 首先对比各种标定方法的精度差异。

投影误差比较

图 1 不用特征点对标定精度的性能比较

注:参考文献《Accurate Camera Calibration using Iterative Refinement of Control Points》

表中显示了通过opencv方法,角点检测,椭圆心检测,以及椭圆环检测,以及对应的迭代方法所产生的均方根误差。从结果看出迭代方法要优于不采用迭代方法的结果。

那么如何才能进行更高精度的相机标定呢?首先要使绘制的图像更容易用于检测,因此查看通过opencv对圆进行绘制的结果。 生成圆

打印图像的结果:
打印圆

由此,研究如何绘制一个高精度的椭圆,对于整个测量系统的精度具有重要意义。

1.1.3 面积法绘制椭圆

如何实现在给定的图像平面中绘制一个具有任意旋转角、任意长短轴的椭圆,且椭圆中心为任意值,且椭圆边缘较为柔和,这是一个亟待解决的问题。不失一般性,我们以在 600pix×600pix 图像尺寸中绘制椭圆中心坐标为(300.67,300.35),长短半轴长分别为 80,60 为例。(单位均为像素)。

1)初步绘制二值化椭圆

对于椭圆总有一般方程

$$Ax^2+Bxy+Cy^2+Dx+Ey+F=0 \tag{1.1}$$

此方程可以变形为

$$A(x-x_0)^2+B(x-x_0)(y-y_0)+C(y-y_0)^2+f=0 \tag{1.2}$$

$x^{ '}=x-x_0 $ , $y^{'}=y-y_0 $

$$Ax^{'2}+Bx^{'}y^{'}+Cy^{'2}+Dx^{'}+Ey^{'}+f=0 \tag{1.3}$$

椭圆的标准方程

$$\frac{x^2}{a^2}+\frac{y^2}{b^2}=1 \tag{1.4}$$

对于斜椭圆,其旋转角为θ,则

$$x=x^{'}cos\theta -y^{'}sin\theta \\\ y= x^{'}sin\theta +y^{'}cos\theta \tag {1.5}$$

带入标准方程,即得到旋转后的方程

$$\frac{(x^{'}cos\theta -y^{'}sin\theta)^2}{a^2}+\frac{(x^{'}sin\theta +y^{'}cos\theta)^2}{b^2}=1 \tag{1.6}$$

经化简得到

$$(a^2sin^2\theta+b^2cos^2\theta)x^{'2}+2(a^2-b^2)sin{\theta}cos{\theta}x^{'}y^{'}+(a^2cos^2\theta+b^2sin^2\theta)y^{'2}-a^2b^2=0 \tag{1.7}$$

所以

$$A=a^2sin^2\theta+b^2cos^2\theta \\\ B=2(a^2-b^2)sin{\theta}cos{\theta} \\\ C=a^2cos^2\theta+b^2sin^2\theta \\\ f=-a^2b^2 \tag{1.8}$$

其算法流程图可归纳总结下面流程图 所示。经过流程图中的步骤,初步绘制好的椭圆二值化图像边缘轮廓。

绘制椭圆二值化图像边缘轮廓

2)面积法的含义

接下来,为了使得椭圆边缘轮廓不显得那么锐利,使用面积法使用面积法将其边缘像素重新赋值,使椭圆轮廓边缘更加平滑。面积法指的是将椭圆边界的像素大小划分为 n×n 个点,根据公式(1.9)将椭圆边缘重新赋值。公式中的 Ia 为椭圆外部的各像素值,Ib 椭圆内部的各像素值,I 为重新赋值的像素值大小。(对于此处的 n 取值大小)。h为判断点个数。

$$I=\frac{h}{n^2}(I_b-I_a)+I_a \tag{1.9}$$

使用面积法的算法流程可大致归纳下面流程图所示。
面积法的算法流程

3)使用面积法精确绘制椭圆

在 上面流程图 中默认已经找出了椭圆的边缘轮廓,但在实际操作中,如何找出椭圆的边缘轮廓仍然是需要解决的问题。此处使用八邻域查找算法,选择的滤波器核大小为3。1,1,1],[1,0,1],[1,1,1

利用此核与整个二值化椭圆图像做卷积运算,初步得到的二值化椭圆经过卷积运算后,如果是椭圆外部的点,像素值皆为 0,此时将其重新赋值为 50,如果是椭圆内部的点,像素值皆为 8,此时我们将其重新赋值为 200。像素值介于 1~7 的部分,便可以认为这是椭圆的边缘轮廓。下图中左图整幅椭圆图像经过八邻域查找法卷积运算后得到的椭圆,右图为椭圆部分边缘轮廓放大后的效果图。

椭圆检测

面积法绘制椭圆

对于椭圆的边缘轮廓,便可以使用面积法,对椭圆边缘轮廓重新赋值。这样,使用面积法绘制理想椭圆的算法流程可归纳总结为上面流程图所示。 经过使用面积法对椭圆边缘轮廓重新赋值之后,绘制好的理想椭圆。图中左边部分为整个椭圆,右边部分为椭圆的轮廓部分截图。

面积法生成椭圆

显然,使用面积法绘制的椭圆边缘更加柔和,椭圆中心检测精度更高。

生成代码如下:

import numpy as np 

def numpy_conv(inputs,filter,_result,padding="VALID"):
    H, W = inputs.shape
    filter_size = filter.shape[0]
    filter_center = int(filter_size / 2.0)
    filter_center_ceil = int(np.ceil(filter_size / 2.0))
    #这里先定义一个和输入一样的大空间,但是周围一圈后面会截掉
    result = np.zeros((_result.shape))
    #更新下新输入,SAME模式下,会改变HW
    H, W = inputs.shape
    #卷积核通过输入的每块区域,stride=1,注意输出坐标起始位置
    for r in range(0, H - filter_size + 1):
        for c in range(0, W - filter_size + 1):
            # 池化大小的输入区域
            cur_input = inputs[r:r + filter_size,
                        c:c + filter_size]
            #和核进行乘法计算
            cur_output = cur_input * filter
            #再把所有值求和
            conv_sum = np.sum(cur_output)
            #当前点输出值
            result[r, c] = conv_sum
    return result

img = np.zeros([600,600])
A = 80**2
B = 0
C = 80**2
f = -80**2*80**2
for i in range(220,380):
    for j in range(220,380):
        if A*(i-300)**2+C*(j-300)**2+f<=0:
            img[i,j]=1
        else:
            img[i,j]=0
filter = np.array([[1,1,1],[1,0,1],[1,1,1]])
img_ = numpy_conv(img,filter,img,padding="VALID")
imgs = np.zeros([600,600])
for i in range(0,600):
    for j in range(0,600):
        if img_[i,j]==0:
            imgs[i,j]=50
        elif 0<img_[i,j]<=7:
            k = 0
            x_list = [s*0.01 for s in range(i*100+0,i*100+101,5)]
            y_list = [s*0.01 for s in range(j*100+0,j*100+101,5)]
            for u in x_list:
                for v in y_list:
                    if A*(u-300)**2+C*(v-300)**2+f<=0:
                        k+=1
            imgs[i,j] = k/21**2*205+50
        else:
            imgs[i,j]=255

1.1.4 工业场景下圆形标志的加工

通过了解,有现成的加工工艺,是通过光刻进行的。其圆度误差能达到1到2微米。因此设计一个像素圆没有意义。

1.2 相机标定

张正友标定法,是由微软研究院的张正友博士于1998年提出的一种介于传统标定方法和自标定方法之间的平面标定法。它即避免了传统标定法设备要求高、操作繁琐等缺点,又比自标定的精度高,鲁棒性好。该方法主要步骤如下:

1)打印一张具有多圆环的图案,并将其贴在一块刚性平面上作为标定板;

2)移动标定板或者相机,从不同角度拍摄若干照片(理论上照片越多,误差越小);

3)对每张照片中的标志点进行检测,从而构成标志点的图像坐标与世界坐标对;

4)在不考虑径向畸变的前提下,即采用相机的线性模型。根据旋转矩阵的正交性,通过求解线性方程,获得摄像机的内部参数和各个图的外部参数;

5)利用最小二乘法估算相机的畸变系数;

6)根据再投影误差最小准则,对内外参进行优化;

1.3 迭代标定摄像机的算法

投影畸变和镜头畸变是导致特征点检测精度下降的重要原因。因此,本算法的思想可以描述为:首先根据传统的摄像机标定方法获得摄像机的参数,将原始图像转换到在平行视图 (fronto parralell view),再进行特征点的检测,然后将得到的特征点转换回原图像,此得到新的三维空间点与图像点的对应性,利用此对应性再次进行摄像机标定。然后重复上 述过程,直至标定精度不再提高为止。

Step 1:获取摄像机标定用的对应性数据

​ 通过椭圆环检测检测椭圆中心,并按照顺序对中心排序。

Step 2:基于平面单应性的摄像机标定

​ 根据张正友的算法,基于平面单应性可计算摄像机参数的初值解,然后使用LM方法进行优化摄像机的内外参数。

Step 3:校正投影和镜头畸变下获取对应性数据

​ 根据已知的摄像机的内外参数,通过世界坐标点集,将原始图像中的模板图像转换为正面视图;然后利用模板匹配思想,将转换后的正面视图与模板进行等同,并将模板图像中标志点所对应的原图亚像素点坐标与模板标志点构成坐标对。

Step 4:已知初值的摄像机标定优化

​ 根据张正友方法,使用LM方法进行优化摄像机的内外参数。

Step 5:收敛性判断,若收敛则结束,否则调到Step 3.

​ 收敛性判断,根据方向投射误差是否缩小,或者根据迭代步数是否已经达到最大。

  • 将图像像素映射到模板图像
def compute_corr(data,intrinsics,new_extrinsics,K,P,path="./data/obj/"):
    N = len(data["sensed_img"])
    imgs = []
    for j in range(N):
        print(data["txts"][j])
        path_txt = data["txts"][j].split(".txt")[0]
        name = path_txt.split("/")[-1]
        new_path = path_txt + "newt.jpg"
        o_img = data["sensed_img"][j]
        # 创建模板大小
        img = np.zeros([2000,2000,3])
        names = {}
        # 遍历模板,寻找对应的亚像素坐标
        for i, x_point in enumerate(range(0,2000)):
            for k, y_point in enumerate(range(0,2000)):
                t1 = np.array([[x_point*0.1], [y_point*0.1], [0.0], [1.0]])
                homog_coords = np.dot(new_extrinsics[j], t1)
                [xc, yc, zc] = homog_coords
                r2 = xc ** 2 + yc ** 2
                xcn = xc * (1 + K[0] * r2 + K[1] * r2 ** 2 + K[2] * r2 ** 3) + P[1] * (r2 + 2 * xc * 2) + 2 * (
                P[0]) * xc * yc
                ycn = yc*(1+K[0]*r2+K[1]*r2**2+K[2]*r2**3)+P[0]*(r2+2*yc*2)+2*(P[1])*xc*yc
                xcn = xcn / zc
                ycn = ycn / zc
                t = np.array([[xcn],[ycn],[1]])
                t = np.dot(intrinsics, t).reshape(1, 3)
                if int(t[0][1]) >= 960:
                    continue
                if int(t[0][0]) >= 1280:
                    continue
                if int(t[0][1]) < 0:
                    continue
                if int(t[0][0]) < 0:
                    continue
                # 图像位置是先竖横
                img[int(k), int(i), :] = o_img[round(t[0][1]), round(t[0][0]), :]
                # 坐标认为u_w,y_h
                names[(int(i), int(k))]=(t[0][0], t[0][1])
        save_obj(names, name,path)
        cv2.imwrite(path+name+".png", img)
        imgs.append(img)
    return imgs 
  • 模板图像
    0

  • 原始图

L0

  • 还原到模板图像相似的图像,并建立像素坐标与世界坐标的坐标对字典。

L0

1.4 投影偏心误差修正

物平面与像平面坐标系

物平面和像平面侧视图

选择合适的物空间辅助坐标系$xyz$,圆形标志在$'xy'$​平面内,圆心在 $x=x_p$​处。相机光心$O'$​在yz平面内,$O'$​与$ xyz$​坐标系原点O的连线与 Z轴夹角为$\alpha$​,距离为$d$​。 摄像机的光轴垂直于x轴。$\omega$​为z轴与z'轴夹角,即圆形标志法向量与光轴夹角。上图中可观察到偏心差$\epsilon$​。如果像平面IP和物平面OP不平行,那么圆形标志的圆心 C在像平面上就不会与椭圆中心$ B'$​重合,而是在$ C'$​处。同样,像平面上的$ B'$​在物平面上对应的也不是C而是 B。

1.4.1圆形标志偏心差模型

圆形标志圆心C对应的像点$C'$的坐标为

$$u'_{C'}=U'|_{y=z=0}^{x=xp}=\frac{cx_p}{dcos(\omega-\alpha)} \tag{1-10}$$ $$v'_{C'}=v'|_{y=z=0}^{x=xp}=-ctan(\omega-\alpha) \tag{1-11}$$

像平面椭圆中心点B‘坐标为

$$u'_{B'}=\frac{1}{2}(u'_1+u'_2)|_{v'=v'_B}=\frac{cx_pdcos(\omega-\alpha)}{d^2cos^2(\omega-\alpha)-r^2sin^2\omega} \tag{1-12}$$ $$u'_{B'}=-c\frac{d^2sin(\omega-\alpha)cos(\omega-\alpha)+r^2sin(\omega)cos(\omega)}{d^2cos^2(\omega-\alpha)-r^2sin^2(\omega)} \tag{1-13}$$

通过图中观察可得,偏心差$\epsilon$应为$B'C'$。所以其坐标可以表示为

$$\epsilon_{u'}=u'_{B'}-u'_{C'}=\frac{c(x_p)sin^2(\omega)}{l((l/r)^2-sin^2(\omega))} \tag{1-14}$$ $$\epsilon_{v'}=v'_{B'}-v'_{C'}=\frac{c(d)sin(\omega)cos(\alpha)}{l((l/r)^2-sin^2(\omega))} \tag{1-15}$$

由上式可得,求偏心差坐标需要已知$c、x_p、l、\omega、r、d、\alpha$7个参数,这需要先对相机进行标定和空间点坐标光束法平差求解才能得到所有参数具体数值,而使用这 7个参数计算偏心差进行补偿校正后为了获得更精确的坐标解通常会再次进行平差处理,该过程计算步骤复杂且误差影响不易评判。

1.4.2 三同心圆标志偏心差模型及解算

模型采用三同心圆标志作为测量点标志。当 3个同心圆投影成3个椭圆,每个椭圆中心都不重合,同心圆中心像点为同一像点。根据[文献][Systematic Geometric Image Measurement Errors of Circular Object Targets: Mathematical Formulation and Correction]中总结的偏心差规律,各椭圆中心与圆形标志真实像点都在一条直线上。三同心圆标志可视为3个$c、x_p、l、\omega、r、d、\alpha$​参数都相同的圆形标志。根据式​(1-14)(1-15)列出3组方程

$$\begin{cases} \epsilon_{u1'}=u'_{B1'}-u'_{C1'}=\frac{c(x_p)sin^2(\omega)}{l((l/r1)^2-sin^2(\omega))} \\ \epsilon_{v1'}=v'_{B1'}-v'_{C1'}=\frac{c(d)sin(\omega)cos(\alpha)}{l((l/r1)^2-sin^2(\omega))} \end{cases} \tag{1-16}$$ $$\begin{cases} \epsilon_{u2'}=u'_{B2'}-u'_{C2'}=\frac{c(x_p)sin^2(\omega)}{l((l/r2)^2-sin^2(\omega))} \\ \epsilon_{v2'}=v'_{B2'}-v'_{C2'}=\frac{c(d)sin(\omega)cos(\alpha)}{l((l/r2)^2-sin^2(\omega))} \end{cases} \tag{1-17}$$ $$\begin{cases} \epsilon_{u3'}=u'_{B3'}-u'_{C3'}=\frac{c(x_p)sin^2(\omega)}{l((l/r3)^2-sin^2(\omega))} \\ \epsilon_{v3'}=v'_{B3'}-v'_{C3'}=\frac{c(d)sin(\omega)cos(\alpha)}{l((l/r3)^2-sin^2(\omega))} \end{cases} \tag{1-18}$$

可将式(1-16,17,18)变换为

$$\begin{cases} \epsilon_{u1'}=u'_{B1'}-u'_{C1'}=-\frac{1}{2}c\frac{x_p}{l} \left( \frac{1}{\frac{l}{r_1sin(\omega)}+1}-\frac{1}{\frac{l}{r_1sin(\omega)}-1} \right) \\ \epsilon_{v1'}=v'_{B1'}-v'_{C1'}=\frac{1}{2}\left(\frac{c(d/l)cot(\omega)}{1-l/(r_1sin(\omega))}+ \frac{c(d/l)cos(\omega)}{1+l/(r_1sin(\omega))}\right) \end{cases} \tag{1-19}$$ $$\begin{cases} \epsilon_{u2'}=u'_{B2'}-u'_{C2'}=-\frac{1}{2}c\frac{x_p}{l} \left( \frac{1}{\frac{l}{r_2sin(\omega)}+1}-\frac{1}{\frac{l}{r_2sin(\omega)}-1} \right) \\ \epsilon_{v2'}=v'_{B2'}-v'_{C2'}=\frac{1}{2}\left(\frac{c(d/l)cot(\omega)}{1-l/(r_2sin(\omega))}+ \frac{c(d/l)cos(\omega)}{1+l/(r_2sin(\omega))}\right) \end{cases} \tag{1-20}$$ $$\begin{cases} \epsilon_{u3'}=u'_{B3'}-u'_{C3'}=-\frac{1}{2}c\frac{x_p}{l} \left( \frac{1}{\frac{l}{r_3sin(\omega)}+1}-\frac{1}{\frac{l}{r_3sin(\omega)}-1} \right) \\ \epsilon_{v3'}=v'_{B3'}-v'_{C3'}=\frac{1}{2}\left(\frac{c(d/l)cot(\omega)}{1-l/(r_3sin(\omega))}+ \frac{c(d/l)cos(\omega)}{1+l/(r_3sin(\omega))}\right) \end{cases} \tag{1-21}$$

参数$c、x_p、l、\omega、r、d、\alpha$可视为常数,令

$$K=c\frac{x_p}{l} \\ P=\frac{l}{sin(\omega)} \\ L=\frac{cd}{l}cot(\omega)$$

并联立(1-19,20,21)求解得。

$$\begin{cases} P^2=\frac{(u'_{B1'}-u'_{B3'})(r_1^2-r_2^2)r_3^2-(u'_{B1'}-u'_{B2'})(r_1^2-r_3^2)r_2^2}{(u'_{B1'}-u'_{B3'})(r_1^2-r_2^2)-(u'_{B1'}-u'_{B2'})(r_1^2-r_3^2)} \\ K=\frac{u'_{B1'}-u'_{B2'}}{\frac{1}{\frac{P^2}{r_1^2}-1}-\frac{1}{\frac{P^2}{r_2^2}-1}} \\\ L=\frac{-(u'_{B1'}-u'_{B2'})}{\frac{1}{\frac{P^2}{r_1^2}-1}-\frac{1}{\frac{P^2}{r_2^2}-1}} \end{cases} \tag{1-22}$$

最后,经改正后的像点C‘的坐标为

$$\begin{cases} u_c=u'_{B1'}-\frac{1}{2}\left(\frac{K}{\frac{P}{r_1}-1}-\frac{K}{\frac{P}{r_1}+1} \right) \\\ v_c=v'_{B1'}-\frac{1}{2}\left(\frac{L}{\frac{P}{r_1}-1}-\frac{L}{\frac{P}{r_1}+1} \right) \end{cases} \tag{1-23}$$

总结

该算法是通过直接获取具有畸变的椭圆圆心。不需要后续进行椭圆圆心修正。

1.4.3 单圆标志偏心差模型及解算

由于畸变模型可得到,相机坐标系下畸变坐标为

$$x_d=x_c+x_c+x_c(k_1r^2+k_2r^4+k_3r^6)+2p_1x_cy_c+p_2(r^2+2x_c^2) \\\ y_d=y_c+x_c+y_c(k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y_c^2)+2p_2x_cy_c \tag{1-24}$$

其中$r=\sqrt{x_c^2+y_c^2}$​。

根据我们的模型有以下式子

$$\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \alpha & \gamma & u_0 \\ 0 & \beta & v_0 \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix}x_d\\y_d \\ 1 \end{bmatrix} \tag{1-25}$$ $$\lambda\begin{bmatrix}x_c \\ y_c \\ 1 \end{bmatrix} = \begin{bmatrix} R&T \\ 0&1\end{bmatrix} \begin{bmatrix} X_w \\Y_w \\ Z_w \\ 1\end{bmatrix} \tag{1-26}$$

当设世界坐标系的平⾯与标定板共⾯,则令$Z_w=0​$

因此上式(1-24,25,26)可表示为

$$\lambda\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22}& h_{23}\\ h_{31} & h_{32} & h_{33} \end{bmatrix}\begin{bmatrix}X_w\\Y_w \\ 1 \end{bmatrix} \tag{1-27}$$

即表示为

$$\lambda m =H M$$

其中H学名为单应性矩阵,而且其能表示世界坐标系到像素坐标系的映射。称为透视投影。

假设我们现在知道标定板中某一圆圆心坐标$(X_0,Y_0)$以及其半径r,那么可以得到圆的方程表示为$x^TQx$,其中$x=[X,Y,1]$

$$Q= \begin{bmatrix}1&0&-X_0 \\ 0&1 &-Y_0 \\ -X_0&-Y_0&X_0^2+Y_0^2-r^2\end{bmatrix} \tag{1-28}$$

那么它的透视投影椭圆系数方程可以表示为

$$Q'=H^{-T}QH^{-1} \tag{1-29}$$

由于Q‘是没有含畸变参数的,因此不能用于椭圆心的计算。

那么如何计算偏心误差呢?

对于一个正圆点,进行均匀采样m个点,记为$(x_i,y_i),i=0,1,2,...,m-1 $,通过初步标定的结果,我们可以获得其含畸变的透视投影点$(u_i,v_i),i=0,1,2,...,m-1$。然后对这m个畸变投影点进行曲线拟合获取畸变椭圆中心$(u_d,v_d)$,另外通过畸变投影关系,可以计算圆心投影的点坐标$(u_c,v_c)$,然后计算这两个的差即偏心差

$$(\Delta x , \Delta y )=(u_d-u_c,v_d-v_c)$$

那么我们期初计算的拟合椭圆心的意义在哪?

我的理解为为我们初标相机内外参,提供变换信息。另外,论文中通过验证获取的拟合椭圆与畸变椭圆的偏差平均值为0.0042像素,最大值为0.0148像素。而由于椭圆检测误差为0.02像素,因此该误差只能忽略不及。

  • 算法 1 单目相机标定算法

1 Input: $(x_{ij} , y_{ij}), (X_i, Y_i), r$

2 $(K^{(0)},D^{(0)})=CalibrateCamera((x_{ij} , y_{ij }), (X_i, Y_i))$​​

3 $k←0, (\Delta x^{(0)}_{ij} , \Delta y^{(0)}_{ij} ) ← (0, 0), i = 1, . . . , m, j = 1, . . . , N$

4 repeat

5 $(\Delta x^{(k+1)}_{ij} , \Delta y^{(k+1)}_{ij} )=Calculate Eccentricity Error(K^{(k)},D^{(k)},(X_i, Y_i), r)$

6 $(\hat x_{ij},\hat y_{ij})=(x_{ij},y_{ij})+(\Delta x^{(k+1)}_{ij} , \Delta y^{(k+1)}_{ij} )$

7 $`(K^{(k+1)},D^{(k+1)})=CalibrateCamera((\hat x_{ij} ,\hat y_{ij }), (X_i, Y_i))$

8 $\Delta = \max(||(\Delta x^{(k+1)}_{ij} , \Delta y^{(k+1)}_{ij} )-(\Delta x^{(k)}_{ij} , \Delta y^{(k)}_{ij} )||)$

9 k=k+1

10 until $\Delta &lt;threshold$ or $k&gt;limit$

11 Output: $K^{k+1},D^{(k+1)}$

改进以上算法:

我们将转换到平行视图的迭代算法添加到偏心误差补偿算法当中。有以上改进的原因在于,虽然将透视变化视图转换到平行视图,也是为了获取更加精确的标志点。而带畸变的偏心误差修正方法与视图转化方法交替进行,可以优化单应矩阵分离的误差,从而获取更加精确的相机内参。

算法步骤:

1 Input: $(x_{ij} , y_{ij}), (X_i, Y_i), r$

2 $(I^{(0)},D^{(0)},R^{(0)},T^{(0)})=CalibrateCamera((x_{ij} , y_{ij }), (X_i, Y_i))$

3 $s←0, (x_{ij} , y_{ij}), (X_i, Y_i)$

4 repeat

5 $k←0, (\Delta x^{(0)}_{ij} , \Delta y^{(0)}_{ij} ) ← (0, 0), i = 1, . . . , m, j = 1, . . . , N$

6 repeat

7 $(\Delta x^{(k+1)}_{ij} , \Delta y^{(k+1)}_{ij} )=Calculate Eccentricity Error(I^{(k)},D^{(k)},R^{(k)},T^{(k)},(X_i, Y_i), r)$

8 $(\hat x_{ij},\hat y_{ij})=(x_{ij},y_{ij})+(\Delta x^{(k+1)}_{ij} , \Delta y^{(k+1)}_{ij} )$

9 $(I^{(k+1)},D^{(k+1)},R^{(k+1)},T^{(k+1)})=CalibrateCamera((\hat x_{ij} ,\hat y_{ij }), (X_i, Y_i))$

10 $\Delta = \max(||(\Delta x^{(k+1)}_{ij} , \Delta y^{(k+1)}_{ij} )-(\Delta x^{(k)}_{ij} , \Delta y^{(k)}_{ij} )||)$

11 k=k+1

12 until $\Delta &lt;threshold$​​​ or $k&gt;limit\_k$​​​​

13 Output: $I^{(k+1)},D^{(k+1)},R^{(k+1)},T^{(k+1)},(\hat x_{ij},\hat y_{ij})$

14 $(\hat x_{ij}^{(s)} , \hat y_{ij}^{(s)}), (X_i, Y_i)= ProjectPoints(I^{(k+1)},D^{(k+1)},R^{(k+1)},T^{(k+1)},(\hat x_{ij},\hat y_{ij}))$​​

15 $err = projectPoints\_err((\hat x_{ij}^{(s)} , \hat y_{ij}^{(s)}), (X_i, Y_i),I^{(k+1)},D^{(k+1)},R^{(k+1)},T^{(k+1)})$

16 s=s+1

18 $(x_{ij} , y_{ij}), (X_i, Y_i)=(\hat x_{ij}^{(s)} , \hat y_{ij}^{(s)}), (X_i, Y_i)$

17 until $err &lt;threshold$​​​ or $s&gt;limit\_s$​​​

18 Ootput: $I^{(k+1)},D^{(k+1)},R^{(k+1)},T^{(k+1)},(\hat x_{ij},\hat y_{ij})$

算法中一些说明:

$(x_{ij} , y_{ij}), (X_i, Y_i), r$ 分别表示检测椭圆坐标,标定板设定圆心的世界坐标,r表示圆半径。CalibrateCamera表示相机标定函数。

Calculate Eccentricity Error计算偏心误差函数。

$(I^{(0)},D^{(0)},R^{(0)},T^{(0)})$​​表示相机内参,畸变,旋转矩阵和平移矩阵。

ProjectPoints返回平行视图情况下世界坐标系下对应的更新的圆心的坐标。

projectPoints_err计算重投影误差函数。

最终迭代算法流程图为:

新的迭代算法步骤

获取平行视图的具体操作请查看1.3节内容

2 极线矫正

极线校正

3 立体匹配

① 极线纠正后,同名点位于同一行内,行坐标相同,只存在列坐标偏差,叫做视差

② 通过任一视图的像素坐标以及视差,即可计算其在另一视图的同名点。

③ 存储每个像素视差值的图像叫做视差图(disparity map)。以像素为单位

④ 视差图可结合基线和相机内参计算深度图(depth map)。是空间单位

而立体匹配任务就是计算视差的过程。

3.1 传统立体匹配方法

立体匹配方法分类:局部方法,全局方法,半全局方法。

立体匹配

立体匹配流程如下:

立体匹配流程

3.1.1 代价函数[^41]

代价函数用于计算左、右图中两个像素之间的匹配代价(cost)。cost越大,表示这两个像素为对应点的可能性越低。

  • AD/BT [^1]
$$C_{AD}(x,y,d)=|I_L(x,y)-I_R(x-d,y)| \tag{3-1}$$
  • AD+Gradient [^2]
$$\rho(q,q')=(1-\alpha)\min(||I_q-I_{q'},\tau_{col}||)+\alpha\min(||\Delta I_q-\Delta I_{q'}||,\tau_{grad}) \tag{3-2}$$

式中$\tau_{col}'$,$\tau_{grad}$为截断阈值,$\alpha`$为权重。

  • Census transform Census

  • SAD/SSD

1)Sum of Squared Defferences (SSD)

$$SSD(u,v) = \sum{[Left(u,v) - Right(u,v)] * [Left(u,v) - Right(u,v)]} \tag{3-3}$$

选择最大值

2)Sum of Absolute Defferences (SAD)

$$SAD(u,v) = \sum{|Left(u,v) - Right(u,v)|} \tag{3-4}$$

选择最小值

算法步骤:

1.构造一个小窗口,类似与卷积核。

2.用窗口覆盖左边的图像,选择出窗口覆盖区域内的所有像素点。

3.同样用窗口覆盖右边的图像并选择出覆盖区域的像素点。

4.左边覆盖区域减去右边覆盖区域,并求出所有像素点差的绝对值的和。

5.移动右边图像的窗口,重复3,4的动作。(这里有个搜索范围,超过这个范围跳出)

6.找到这个范围内SAD值最小的窗口,即找到了左边图像的最佳匹配的像素块。

  • [NCC][https://blog.csdn.net/aaronmorgan/article/details/79121434]
$$C_{NCC}(X',y',d)=\frac{\sum_{(x,y)\in W(x',y')}(I_L(x,y)-\hat u_L)(I_R(x-d,y)-\hat u_R)}{\sqrt{\sum_{(x,y)\in W(x',y')} (I_L(x,y)-\hat u_L)^2}\sqrt{\sum_{(x,y)\in W(x',y')} (I_R(x-d,y)-\hat u_R)^2}} \tag{3-5}$$
def compute_costvolume_ncc(left_image, right_image, D, R):
    """
    Compute a cost volume with maximum disparity D considering a neighbourhood R with Normalized Cross Correlation (NCC)
        D: 最大视差
        R: 滤波器半径
        return:   代价输出结果 (H,W,D)
    """
    (H,W) = left_image.shape
    cv    = np.zeros((D,H,W))
    # 遍历所有可能的差异
    for d in range(0, D):
        for y in range(R, H - R):
            for x in range(R, W - R):
                l_mean = 0
                r_mean = 0
                n      = 0
                # 计算窗口均值
                for v in range(-R, R + 1):
                    for u in range(-R, R + 1):
                        l_mean += left_image[y+v, x+u]
                        r_mean += right_image[y+v, x+u-d]
                        n      += 1
                l_mean = l_mean/n
                r_mean = r_mean/n
                l_r   = 0
                l_var = 0
                r_var = 0
                for v in range(-R, R + 1):
                    for u in range(-R, R + 1):
                        l = left_image[y+v, x+u]    - l_mean
                        r = right_image[y+v, x+u-d] - r_mean
                        l_r   += l*r
                        l_var += l**2
                        r_var += r**2
                cv[d,y,x] = -l_r/np.sqrt(l_var*r_var)
    return np.transpose(cv, (1, 2, 0))
  • [AD+Census][https://www.cnblogs.com/sinbad360/p/7842009.html]

ad_censu

AD代价函数容易实现,但是它容易受辐射差异的影响。而在Census变换中,不要求像对之间的颜色一致性。因此,它对于辐射差异更加鲁棒。

3.1.2 代价聚合

  • Box Filtering
$$C_d^A(p) = \frac{1}{N}\sum_qC_d(q) \tag{3-6}$$

q 是指定的区域内的像素。优点,计算速度快 ;缺点,不具备保持边缘的特性。

  • Bilateral filter[^40]

  • Cross-based local stereo matching[[^39]

  • Semi-Global Matching[^38]

​ 能量函数

$$E(D)=\sum_p(C(p,D_P)+\sum_{q\in N_p}P_1T[|D_p-D_q|=1])+\sum_{q\in N_p}P_2T[|D_p-D_q|>1]) \tag{3-7}$$

​ 式中第一项是基于互信息的代价计算项;后两项是当前像素p和其邻域Np内所有像素q之间的约束,如果p和q的视差只差1,那么惩罚P1,否则惩罚系数P2,P2要大于P1。如果当前点和邻域点的差值比较小,就选择一个小的惩罚值,这么做保证可以对斜面和曲面有一定的适应性

​ 优化方法

​ (1)计算代价空间;(AD,Census,...)

​ (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_iL_r(p-r,i)+P_2)-\min_kL_r(p-r,k) \tag{3-8}$$

​ 以p为中心,可以找到16个(或8个,下同)邻域方向,然后在每个邻域方向上有一个指向p的矢量,而r表示16个矢量中的某一个。因此Lr就是代表当前矢量路径r上的代价聚合值。所以,S(p,d)就是把16个代价聚合值相加,而这16个又都是各自路径上的最小代价。所以求出来的S(p,d)就是p点的最小代价。P点上某个邻域方向的代价聚合值分为三项,第一是当前点的匹配代价;第二项是min(当前邻域方向上p-r这个像素点的当前视差代价聚合值,p-r点的视差差值为1的代价聚合值 + P1,p-r点的视差插值大于1的最小代价聚合值 + P2);最后一项是p-r点的视差插值大于1的最小代价聚合值,最后一项是为了防止计算结果太大,做的统一的调整。

​ (3) WTA

​ (4) 视差后处理

路径优化

​ 讲解:[^36][^37]

3.1.3 视差计算

• Winner-Take-All (WTA) 胜者为王

该方法通过计算每个匹配窗口对应的待匹配像素点的匹配代价 ,然 后 后进行匹配代价排 序 ,选择匹配代价最小窗口为最终结果。

• Disparity propagation (PatchMatch)

3.1.4 视差优化、后处理

• 左右一致性检测 (LRC)

一般是以某一视图为基准,进行视差计算的,这里需要对两边视图都需要计算,同时对视差进行比较,相同为通过检测,不相同为不通过检测。

• the minimum / the second minimum cost

• Speckle Filter

为了移除噪声点,对视差图做一个连通区域提取(如果某相邻的2个像素的视差值之差小于某个预先设定的阈值,就可以认为这两个像素属于同一个区域)。

• 亚像素插值

抛物线插值和线性插值

• 中值滤波

• 空洞填充

3.2 深度学习立体匹配方法

3.2.1 18年以前

1)MatchNet[^5]: Unifying feature and metric learning for patch-based matching first propose a deep

2)network to match two image patches定义了特征和匹配度量,首先提出使用深度网络来匹配两个图 像块。

3)Efficient Deep learning for stereo matching[^6] & MCCNN[^7] : 使用学习到的特征进行立体匹配。

4)GCNet[^8] : 通过soft argmin操作使用3D CNN来正则化代价体,预测视差图。

5)learned multi-patch similarity[^9] : 代替传统的代价衡量。

6)surfaceNet[^10] :第一个基于学习的MVS问题pipline

7)learning a stereo maching[^11] :相机参数以投影操作的形式编码于网络中。来形成代价体。

3.2.2 近来年

3.2.2.1 (ECCV 2018) MVSNet:Depth inference for Unstructured Multi-view Stereo
3.2.2.2(ECCV 2019) P-MVSNet:Learning Patch-wise Matching Confidence Aggregation for Multi-View Stereo
3.2.2.3(ECCV 2020) Pyramid Multi-view Stereo Net with self-adaptive ViewAggregation
3.2.2.4(CVPR 2020 )Cost Volume Pyramid Based Inference for Multi-view Stereo

4 三维重建

深度模型

5 双目测距系统误差分析

5.1 成像模型误差

由于镜头设计的复杂性和工艺水平等影响因素,实际成像系统不可能严格地满足中心透镜投影模型,从而使得物点在相机成像面上实际所成的像与理想成像之间存在光学畸变误差。
1)径向误差

$$\delta_{xr}=kx_d(x_d^2+y_d^2)^2+O(x_d,y_d)^5 \\\ \delta_{yr}=ky_d(x_d^2+y_d^2)^2+O(x_d,y_d)^5 \\\ r^2 = x_d^2+y_d^2 \tag {5-1}$$

式中,$\delta_{xr}$$\delta_{yr}$分别为径向畸变引起的水平和垂直方向的畸变量;k为镜头径向畸变系数;$(x_d,y_d)$为图像归一化坐标,与图像坐标之间的关系为

$$\begin{cases} x_d=x-c_x \\ y_d=y-c_y \end{cases} \tag{5-2}$$

式中,$(c_x,c_y)$为光心,即光轴与像面交点的坐标。 2)偏心误差
由于装配误差,组成镜头的多个透镜的光轴不可能完全共线,从而引起偏心误差,这种变形由径向畸变和切线畸变共同构成,其数学模型为

$$\begin{cases} \delta_{xp}=p_1(3x_d^2+y_d^2)+2p_2x_dy_d +O(x_d,y_d)^4 \\ \delta_{yp}=2p_1x_dy_d+p_2(3x_d^2+y_d^2)+O(x_d,y_d)^4 \end{cases} \tag{5-3}$$

3)薄棱镜误差
薄棱镜畸变是由光学镜头制造误差和CCD制造误差引起的图像变形,这种变形也由径向畸变和切向畸变共同构成。这种畸变可通过附加一个薄棱镜到光学系统中,引起径向和切向畸变附加量而适当建模,其数学模型为

$$\begin{cases} \delta_{xs}=s_1(x_d^2+y_d^2)+O(x_d,y_d)^4 \\ \delta_{ys}=s_2(x_d^2+y_d^2)+O(x_d,y_d)^4 \end{cases} \tag{5-4}$$

式中,$\delta_{xs}$,$\delta_{ys}$分别为薄棱镜畸变引起的水平和垂直方向的畸变量;$s_1$,$s_2$为薄棱镜畸变系数。
考虑以上三种镜头畸变,未有畸变像点$(x_d,y_d)$与有畸变像点$(x,y)$之间的关系为

$$\begin{cases} x_p=x+\delta_{xr}+\delta_{xp}+\delta_{xs} \\ y_p=x+\delta_{yr}+\delta_{yp}+\delta_{ys} \end{cases} \tag{5-5}$$

5.2 透视误差

根据中心透视投影关系,一个不垂直于光轴的平面经过镜头后所成的像还是一个不垂直于光轴的平面,但它只能在垂直于光轴的图像传感器上成像因而造成了透视误差。如下图所示,一个倾斜的正四边形目标根据中心透视投影关系所成像应为ABCD(设其所在平面坐标为$X_2OY_2$),该像在CCD的投影为abcd(设其所在平面坐标系为$X_1OY_1$),显然,abcd已不是一个正四边形。如果要把$X_1OY_1$上的失真图像还原为$X_2OY_2$上的理想图像,需要将理想像面坐标系的坐标转换成$X_1Y_1Z$坐标系的坐标系。由于坐标系$X_2OY_2$$X_1OY_1$的原点是重合的,可假设坐标平面$X_2OY_2$先绕$X_1Y_1Z$坐标系的$X_1$轴旋转角度$\alpha$,再绕Y_1轴旋转角度为$\beta$

透镜误差

根据上述分析可建立未有透视误差的像点$(x_d,y_d,z_d)$与有透视误差像点x,y,z之间的关系,即

$$\begin{bmatrix} x_q \\y_q \\z_q \end{bmatrix} = \begin{bmatrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{bmatrix} \begin{bmatrix} 1&0&0 \\0&cos\alpha&-sin\alpha \\ 0& sin\alpha& cos\alpha \end{bmatrix}\begin{bmatrix} x \\y \\z\end{bmatrix} \tag{5-6}$$

由式(4-6)可得

$$\begin{cases} x_q=xcos\beta-ysin\alpha sin\beta-zcos\alpha sin\beta \\ y_q=ycos\alpha-zsin\alpha \end{cases} \tag{5-7}$$

式中,z为镜头中心到CCD的距离,是一个定值。

5.3 边缘检测算法的定位误差

边缘是灰度梯度方向上梯度最大的位置,而这个边缘特征是在理想边缘模型下得到的,因此所检测的边缘点有可能不是真实边缘。光照系统的不均匀照度、光和物体相互作用时产生的渐晕,以及滤波都可能使边缘发生偏移。在边缘定位精度较高的情况下,真实边缘与提取边缘之间只相差一个$\Delta$. 因此可建立未有定位误差的像点$(x_e,y_e)$与实际像点x,y之间的关系为

$$\begin{cases} x_e=x+\Delta_x \\ y_e=y+\Delta_y \end{cases} \tag{5-8}$$

式中,$\Delta_x$,$\Delta_y$分别为$x$,$y$​方向的偏移量。

5.4 双目测距误差

1)视差偏差越小,深度偏差越小;换言之,算法的视差精度越高,深度精度越高,深度精度和视差精度成正比。

2)基线越大、焦距(像素单位)越长,深度精度越高。深度精度和基线、焦距成正比。

3)像素大小越小,同样的物理尺寸焦距有更长的像素尺寸焦距,深度精度就越高。

4)测量目标离系统越近,深度精度越高。

  • 设计双目系统能提高精度方法

1)选高精度视差估计算法 2)在应用场景允许、结构稳定性满足需求的情况下,尽可能延长基线 3)在视场范围、景深满足需求的情况下,尽可能选择长焦镜头 4)在算力允许的情况下,选择高分辨率相机(本质上应该是像素尺寸小的相机,有的相机提高了分辨率,只是提升了视域,但像素尺寸不变,那精度也不变) 5)测量距离适当拉近(这点往往是场景需求决定的)

6 双目测距注意事项

6.1 测量系统精度影响因素

采用视觉测量系统进行测量时,需要对系统进行标定,以便确定物理尺寸和像素尺寸之间的换算关系,而要完成标定过程,就需要有一个精确地标定参照物,通常情况下标定参照物应满足以下基本条件。

1)标定参照物的精度与待标定系统处于同一数量级。

2)标定参照物图像特征部分应易于提取。

3)标定参照物与被测物体的成像条件(物距、光照强度、拍摄参数)一致。

4)标定参照物应具有抗干扰能力强,无方向标记要求,使用方便,标定效果比较理想等优点。

  • 误差的原因包括:

1)标定模板的加工精度。标定板的加工质量是影响图像处理算法提取标志点精度的主要因素。

2)标定模板的放置。在对标定板进行拍摄时,应尽量使其充满视场。因此,应多选择视场中的几个位置进行拍摄。另外,标定板应向不同方向倾斜,且以倾斜45度为最优。

3)拍摄标定图像的数量。一般而言,图像越多,标定精度越高。但是会使得标定计算量增加。而且在图像数量增加到一定数量时,标定精度将趋于稳定。根据试验,选择9张图像在标定精度和计算量两方面达到较好的平衡。

4)双目视觉系统的同步拍摄。虽然试验时所采用的标定图像属于静态拍摄,但是拍摄机拍摄的同步性仍能影响标定精度,所以应采用同步采集。

6.2 其他影响因素

1)对环境光照非常敏感。双目立体视觉法依赖环境中的自然光线采集图像,而由于光照角度变化、光照强度变化等环境因素的影响,拍摄的两张图片亮度差别会比较大,这会对匹配算法提出很大的挑战。

2)不适用于单调缺乏纹理的场景。由于双目立体视觉法根据视觉特征进行图像匹配,所以对于缺乏视觉特征的场景(如天空、白墙、沙漠等)会出现匹配困难,导致匹配误差较大甚至匹配失败。

3)计算复杂度高。该方法需要逐像素匹配;又因为上述多种因素的影响,为保证匹配结果的鲁棒性,需要在算法中增加大量的错误剔除策略,因此对算法要求较高,想要实现可靠商用难度大,计算量较大。

4)相机基线限制了测量范围。测量范围和基线(两个摄像头间距)关系很大:基线越大,测量范围越远;基线越小,测量范围越近。所以基线在一定程度上限制了该深度相机的测量范围。

7 总结

1)我们的项目目标精度要于标定板同级,不能达到通过一个mm级精度标定,去取得$\mu m$级的精度。

2)通过调光系统将角点坐标尽可能在亚像素上能识别,即角点边缘尽可能可识别。(当前设备可以实现)

3)应使相机视野内不同位置上都进行标定板放置,然后分别拍摄图片,使得标定板落到整个画幅空间。(需要注意的是保持标定板稳定,角度大于10度)

4)畸变误差要尽可能多取(8项)。(对于椭圆拟合,一定要去偏心误差)

5)选高精度视差估计算法(在特征点匹配时,尽可能使左右视图的同名特征点相同)

参考文献

[^1]: Birchfield S, Tomasi C. A pixel dissimilarity measure that is insensitive to image sampling[J]. IEEE Transactions on Pattern Analysis and Machine Intelligence, 1998, 20(4): 401-406. [^2]: Bleyer M, Rhemann C, Rother C. PatchMatch Stereo-Stereo Matching with Slanted Support Windows. BMVC. 2011. [^3]: 3.Stefano Mattoccia Stereo Vision: Algorithms and Applications [^4]: D. Scharstein and R. Szeliski, A taxonomy and evaluation of dense two-frame stereo correspondence algorithms Int. Jour. Computer Vision, 47(1/2/3):7–42, 2002
[^5]: Han, X., Leung, T., Jia, Y., Sukthankar, R., Berg, A.C.: Matchnet: Unifying feature and metric learning for patch-based matching. Computer Vision and Pattern Recognition (CVPR) (2015) [^6]: Luo, W., Schwing, A.G., Urtasun, R.: Efficient deep learning for stereo matching. Computer Vision and Pattern Recognition (CVPR) (2016) [^7]: Zbontar, J., LeCun, Y.: Stereo matching by training a convolutional neural network to compare image patches. Journal of Machine Learning Research (JMLR) (2016) [^8]: Kendall, A., Martirosyan, H., Dasgupta, S., Henry, P.: End-to-end learning of geometry and context for deep stereo regression. Computer Vision and Pattern Recognition (CVPR) (2017) [^9]: Hartmann, W., Galliani, S., Havlena, M., Van Gool, L., Schindler, K.: Learned multi-patch similarity. International Conference on Computer Vision (ICCV) (2017) [^10]: Ji, M., Gall, J., Zheng, H., Liu, Y., Fang, L.: Surfacenet: An end-to-end 3d neural network for multiview stereopsis. International Conference on Computer Vision (ICCV) (2017) [^11]: Kar, A., H¨ane, C., Malik, J.: Learning a multi-view stereo machine. Advances in Neural Information Processing Systems (NIPS) (2017) [^12]: [Yoon 2006] Yoon K J, Kweon I S. Adaptive support-weight approach for correspondence search. IEEE TPAMI, 2006. [^13]: [Wang 2006] Wang L, Liao M, Gong M, et al. High-quality real-time stereo using adaptive cost aggregation and dynamic programming. 3D Data Processing, Visualization, and Transmission, Third International Symposium on. IEEE, 2006. [^14]: [Hirschmuller 2008] Hirschmuller H. Stereo processing by semiglobal matching and mutual information. IEEE TPAMI, 2008. [^15]: [Zhang 2009] Zhang Ke, Lu J, Lafruit G. Cross-based local stereo matching using orthogonal integral images. IEEE TCSVT, 2009. [^16]: [He 2010] K. He, J. Sun, and X. Tang. Guided Image Filtering. ECCV 2010. [^17]: [Mei 2011]Mei X, Sun X, Zhou M, et al. On building an accurate stereo matching system on graphics hardware. ICCV Workshops. 2011. [^18]: [Rhemann 2011] Rhemann C, Hosni A, Bleyer M. Fast cost-volume filtering for visual correspondence and beyond. IEEE CVPR, \2011. [^19]: [Bleyer 2011] Bleyer M, Rhemann C, Rother C. PatchMatch Stereo-Stereo Matching with Slanted Support Windows. Bmvc. 2011. [^20]: [Yang 2012] Q X Yang. A non-local cost aggregation method for stereo matching. CVPR 2012. [^21]: [Kowalczuk 2013] Kowalczuk J, Psota E T, Perez L C. Real-time stereo matching on CUDA using an iterative refinement method for adaptive support-weight correspondences. IEEE TCSVT, 2013. [^22]: [Ma 2013] Ma Z, He K, Wei Y, et al. Constant time weighted median filtering for stereo matching and beyond. ICCV 2013. [^23]: [Zhang 2014] Zhang Kang, Fang Y, Min D, et al. Cross-scale cost aggregation for stereo matching. CVPR 2014. [^24]: Yang Q. Hardware-efficient bilateral filtering for stereo matching. IEEE TPAMI, 2014. [^25]: [Wang 2015] Wang W, Yan J, Xu N, et al. Real-time high-quality stereo vision system in FPGA. IEEE Transactions on Circuits and Systems for Video Technology, 2015, 25(10): 1696-1708. [^26]: [Kim 2016] K.-R. Kim and C.-S. Kim. Adaptive smoothness constraints for efficient stereo matching using texture and edge information. ICIP 2016. [^27]: [Li 2016] Li A, Chen D, Liu Y. Coordinating multiple disparity proposals for stereo computation. CVPR 2016 [^28]: [Zbontar 2016] Zbontar J, LeCun Y. Stereo matching by training a convolutional neural network to compare image patches. Journal of Machine Learning Research, 2016. [^29]: [Park 2017] Park H, Lee K M. Look wider to match image patches with convolutional neural networks. IEEE Signal Processing Letters, 2017. [^30]: [Li 2017] Li L, Yu X, Zhang S, et al. 3D cost aggregation with multiple minimum spanning trees for stereo matching. Applied optics, 2017 [^31]: D. Scharstein, T. Taniai, and S. Sinha. Semi-global stereo matching with surface orientation priors. 3DV 2017. [^32]: Leonid Keselman, et al. Intel R RealSenseTM Stereoscopic Depth Cameras. CVPRW. 2017. [^33]:3D视觉工坊知识星球 [^34]:机器视觉精密测量技术与应用 赵文辉 王宁等著 [^35]:机器视觉技术 陈兵旗编著 [^36]:https://blog.csdn.net/zilanpotou182/article/details/73382412 [^37]:https://blog.csdn.net/zhubaohua_bupt/article/details/51866567 [^38]:Hirschmuller H. Stereo processing by semiglobal matching and mutual information. IEEE TPAMI, 2008 [^39]: Zhang 2009 Zhang K, Lu J, Lafruit G. Cross-based local stereo matching using orthogonal integral images. IEEE TCSVT, 2009 [^40]:Yoon K J, Kweon I S. Adaptive support-weight approach for correspondence search. IEEE TPAMI, 2006 [^41]:https://blog.csdn.net/hujingshuang/article/details/47759579

⚠️ **GitHub.com Fallback** ⚠️