背景介绍
结构光测量技术包括线结构光和面结构光测量,其中,面结构光又包括相位测量轮廓术PMP(phase measurement profilometry),又称为相移测量轮廓术PSP(phase shifting profilometry),傅里叶变换轮廓术(FTP)等。还有很多其他面结构光测量技术,此处不做过多介绍,感兴趣的可查阅相关综述。线结构光测量技术因其有强烈的噪声不敏感特性,具有较高的测量精度,一般用于测量具有高反的金属工件,PCB板等,但其空间分辨率不足。面结构光具有高的空间分辨率,且测量速度快,具有良好的测量精度,研究的比较多,以下结构光测量技术特指相移条纹结构光测量技术。
基本原理
相移条纹测量技术一言以蔽之就是向待测物体投射编码正弦条纹,相机拍摄经物体高度调制后变形条纹,解析变形条纹相位从而恢复出物体三维形貌。基本原理和变形条纹图如下所示。
相位测量轮廓术是基于三角测量原理,如上图所示的发散测量系统,
P
1
P_1
P1,
P
2
P_2
P2分别位投影仪的入瞳和出瞳,
I
1
I_1
I1,
I
2
I_2
I2分别为相机的入瞳和出瞳。相机和投影仪出瞳处于同高度,两者之间的距离位
d
d
d,距离参考面的高度位
L
L
L,三角形
P
1
I
2
D
P_1I_2D
P1I2D与
A
C
D
ACD
ACD相似,则
d
L
−
h
(
x
,
y
)
=
h
(
x
,
y
)
A
C
⇒
h
(
x
,
y
)
=
L
d
A
C
+
d
(1)
\frac{d}{L-h(x,y)}=\frac{h(x,y)}{AC}\Rightarrow h(x,y)=\frac{Ld}{AC+d} \tag{1}
L−h(x,y)d=ACh(x,y)⇒h(x,y)=AC+dLd(1)
我们从相机视角看待公式(1),
L
L
L,
d
d
d是系统参数,已知量,AC是未知量。假设没有物体时,C点成像在相机P点,有一个物体时,D点同样成像在相机P点(因为CD在同一条光线上),因为AD处于同一条光线上,所以AD两点对应于投影仪上同一点,即D点相位与A点的相位相同,
A
C
=
f
(
ϕ
(
D
)
−
ϕ
(
C
)
)
=
f
(
δ
ϕ
p
)
AC=f(\phi(D)-\phi(C))=f(\delta\phi_p)
AC=f(ϕ(D)−ϕ(C))=f(δϕp),其中,
δ
ϕ
p
\delta\phi_p
δϕp指的是相机上P点位置的相位差,相位差指的是参考面和待测物体之间的相位差值。实际测量时,先拍摄参考面,获得参考面的相位,然后在拍摄物体,获得物体的相位,然后两组相位作差得到每个像素点的相位差。至此,相位测量轮廓术的公式(1)可完整表达成下述形式:
h
(
x
,
y
)
=
L
d
f
(
δ
Φ
(
x
,
y
)
)
+
d
(2)
h(x,y)=\frac{Ld}{f(\delta \Phi(x,y))+d} \tag{2}
h(x,y)=f(δΦ(x,y))+dLd(2)
公式(2)表明条纹相位受物体高度调制,但是调制的具体表达式我们并不清楚(对于具体的系统结构,这个高度对相位的调制方式可以近似推导出来的,比如远心系统)。如果在整个平面上条纹周期不变,则AC之间的距离完全可表达为
d
a
c
=
δ
ϕ
/
2
π
f
d_{ac}=\delta \phi/{2\pi f}
dac=δϕ/2πf,其中,
f
f
f为参考面上的条纹频率。实际上,我们不能精确测量出参考面上的条纹频率。
公式(1)是相位测量轮廓术的几何表达式,公式(2)是相位测量轮廓术的相位表达式,式中的相位映射关系
f
f
f我们无法精确得到。在实际的测量系统中,我们很难满足相机和投影仪的出瞳位于同一高度,并且相机和投影仪之间的距离也很难精准测量,所以,一般都是通过标定的方式间接得到相位和高度之间的映射关系:
h
(
x
,
y
)
=
a
0
+
a
1
δ
Φ
(
x
,
y
)
+
a
2
δ
Φ
2
(
x
,
y
)
(3)
h(x,y)=a_0+a_1\delta \Phi(x,y)+a_2\delta \Phi^2(x,y) \tag{3}
h(x,y)=a0+a1δΦ(x,y)+a2δΦ2(x,y)(3)
公式(3)就是相位测量轮廓术的相位和高度之间的多项式表达式,其中,多项式系数
a
i
a_i
ai通过标定的手段得到。
相移
到目前为止,我们明白了相位测量轮廓术的原理是待测物体的高度对正弦条纹相位调制引起相位变化,我们通过求解变形条纹相位间接得到物体高度,但问题的关键是我们如何才能得到相位呢?这时候就需要通过相移技术来计算得到相位了,说白了相移就是为了构造方程来求解方程系数。
一般计算机生成正弦条纹图
I
(
x
,
y
)
=
A
(
x
,
y
)
+
B
(
x
,
y
)
c
o
s
(
ϕ
(
x
,
y
)
)
I(x,y)=A(x,y)+B(x,y)cos(\phi(x,y))
I(x,y)=A(x,y)+B(x,y)cos(ϕ(x,y)),其中,
A
A
A表示背景光,
B
B
B表示条制度,
ϕ
\phi
ϕ表示相位,一般表示为
ϕ
(
x
,
y
)
=
2
π
f
x
\phi(x,y)=2\pi fx
ϕ(x,y)=2πfx。这样的条纹投射到物体表面,然后经相机拍摄后的条纹图变为
I
c
(
x
,
y
)
=
R
(
x
,
y
)
[
A
(
x
,
y
)
+
B
(
x
,
y
)
c
o
s
(
ψ
(
x
,
y
)
)
]
+
b
(
x
,
y
)
⇒
I
c
(
x
,
y
)
=
A
(
x
,
y
)
+
B
(
x
,
y
)
c
o
s
(
ψ
(
x
,
y
)
)
I^c(x,y)=R(x,y)[A(x,y)+B(x,y)cos(\psi(x,y))]+b(x,y)\Rightarrow I^c(x,y)=A(x,y)+B(x,y)cos(\psi(x,y))
Ic(x,y)=R(x,y)[A(x,y)+B(x,y)cos(ψ(x,y))]+b(x,y)⇒Ic(x,y)=A(x,y)+B(x,y)cos(ψ(x,y))
其中,
R
R
R表示物体反射率,
b
b
b是背景光强。这样我们分别向参考面和待测物体投射上述条纹,然后相机分别拍摄反射回来的条纹:
I
r
e
f
c
=
A
r
e
f
(
x
,
y
)
+
B
r
e
f
c
o
s
(
ψ
(
x
,
y
)
)
I
c
=
A
(
x
,
y
)
+
B
(
x
,
y
)
c
o
s
(
Ψ
(
x
,
y
)
)
I^c_{ref}=A_{ref}(x,y)+B_{ref}cos(\psi(x,y))\\ I_c=A(x,y)+B(x,y)cos(\Psi(x,y))
Irefc=Aref(x,y)+Brefcos(ψ(x,y))Ic=A(x,y)+B(x,y)cos(Ψ(x,y))
如果分别求解出经参考面和待测物体表面反射后的条纹相位,则得到
δ
Φ
(
x
,
y
)
=
Ψ
(
x
,
y
)
−
ψ
(
x
,
y
)
\delta \Phi(x,y)=\Psi(x,y)-\psi(x,y)
δΦ(x,y)=Ψ(x,y)−ψ(x,y)。问题是,条纹图中有3个未知数,分别为
A
A
A,
B
B
B和
ψ
\psi
ψ,我们至少需要3个方程才可以求出三个未知数。此时,相移法终于排上用场了。
假设使用N步相移(N >= 3),计算机生成相移条纹:
I
n
(
x
,
y
)
=
A
+
B
c
o
s
(
2
π
f
x
+
2
π
(
n
−
1
)
/
N
)
I_n(x,y)=A+Bcos(2\pi fx+2\pi (n-1)/N)
In(x,y)=A+Bcos(2πfx+2π(n−1)/N)则相机拍摄回来的相移条纹可表示为:
I
n
c
(
x
,
y
)
=
A
+
B
c
o
s
(
ψ
(
x
,
y
)
+
2
π
(
n
−
1
)
/
N
)
,
n
=
1
,
2
,
.
.
.
N
I^c_n(x,y)=A+Bcos(\psi(x,y)+2\pi (n-1)/N), n=1,2,...N
Inc(x,y)=A+Bcos(ψ(x,y)+2π(n−1)/N),n=1,2,...N
下面除非特别说明,否则条纹图都指的是相机拍摄的,N步相移,我们有:
{ I 1 = A + B c o s ( ψ + δ 1 ) = A + B c o s ( ψ ) c o s ( δ 1 ) − B s i n ( ψ ) s i n ( δ 1 ) I 2 = A + B c o s ( ψ + δ 2 ) = A + B c o s ( ψ ) c o s ( δ 2 ) − B s i n ( ψ ) s i n ( δ 2 ) . . . I n = A + B c o s ( ψ + δ n ) = A + B c o s ( ψ ) c o s ( δ n ) − B s i n ( ψ ) s i n ( δ n ) \begin{cases} I_1 = A+Bcos(\psi+\delta_1)=A+Bcos(\psi)cos(\delta_1)-Bsin(\psi)sin(\delta_1)\\ I_2=A+Bcos(\psi+\delta_2)=A+Bcos(\psi)cos(\delta_2)-Bsin(\psi)sin(\delta_2)\\ ...\\ I_n=A+Bcos(\psi+\delta_n)=A+Bcos(\psi)cos(\delta_n)-Bsin(\psi)sin(\delta_n) \end{cases} ⎩⎪⎪⎪⎨⎪⎪⎪⎧I1=A+Bcos(ψ+δ1)=A+Bcos(ψ)cos(δ1)−Bsin(ψ)sin(δ1)I2=A+Bcos(ψ+δ2)=A+Bcos(ψ)cos(δ2)−Bsin(ψ)sin(δ2)...In=A+Bcos(ψ+δn)=A+Bcos(ψ)cos(δn)−Bsin(ψ)sin(δn)
式中, A , B , ψ A,B,\psi A,B,ψ是未知量,更一般表达
I i = a + b ∗ c o s ( δ i ) + c ∗ s i n ( δ i ) I_i=a+b*cos(\delta_i)+c*sin(\delta_i) Ii=a+b∗cos(δi)+c∗sin(δi)
其中, a = A a=A a=A, b = B c o s ( ψ ) b=Bcos(\psi) b=Bcos(ψ), c = − B s i n ( ψ ) c=-Bsin(\psi) c=−Bsin(ψ)使用最小二乘法对上式求解,定义:
θ ( a , b , c ) = ∑ i = 1 N ( y i − y ) 2 = ∑ i = 1 N ( I i − a − b ∗ c o s ( δ i ) − c ∗ s i n ( δ i ) ) 2 \theta(a,b,c)=\sum_{i=1}^N(y_i-y)^2=\sum_{i=1}^N(I_i-a-b*cos(\delta_i)-c*sin(\delta_i))^2 θ(a,b,c)=i=1∑N(yi−y)2=i=1∑N(Ii−a−b∗cos(δi)−c∗sin(δi))2
分别对 a a a, b b b, c c c求偏导有:
{ ∂ θ ∂ a = − 2 ∑ ( I i − a − b ∗ c o s ( δ i ) − c ∗ s i n ( δ i ) ) = 0 ∂ θ ∂ b = − 2 ∑ ( I i − a − b ∗ c o s ( δ i ) − c ∗ s i n ( δ i ) ∗ c o s ( δ i ) ) = 0 ∂ θ ∂ c = − 2 ∑ ( I i − a − b ∗ c o s ( δ i ) − c ∗ s i n ( δ i ) ∗ s i n ( δ i ) ) = 0 \begin{cases} \frac {\partial \theta}{\partial a} = -2\sum (I_i-a-b*cos(\delta_i)-c*sin(\delta_i)) = 0\\ \frac {\partial \theta}{\partial b} = -2\sum (I_i-a-b*cos(\delta_i)-c*sin(\delta_i)*cos(\delta_i)) = 0\\ \frac {\partial \theta}{\partial c} = -2\sum (I_i-a-b*cos(\delta_i)-c*sin(\delta_i)*sin(\delta_i)) = 0 \end{cases} ⎩⎪⎨⎪⎧∂a∂θ=−2∑(Ii−a−b∗cos(δi)−c∗sin(δi))=0∂b∂θ=−2∑(Ii−a−b∗cos(δi)−c∗sin(δi)∗cos(δi))=0∂c∂θ=−2∑(Ii−a−b∗cos(δi)−c∗sin(δi)∗sin(δi))=0
写成矩阵形式有:
所以有:
t a n ( ψ ( x , y ) ) = − c b = − ∑ I i ( x , y ) ∗ s i n ( δ i ) ∑ I i ( x , y ) ∗ c o s ( δ i ) ⇒ ψ ( x , y ) = − a t a n ( ∑ I i ( x , y ) ∗ s i n ( δ i ) ∑ I i ( x , y ) ∗ c o s ( δ i ) ) tan(\psi(x,y)) = -\frac{c}{b}=-\frac{\sum I_i(x,y) * sin(\delta_i)}{\sum I_i(x,y) * cos(\delta_i)}\Rightarrow\\ \psi(x,y)=-atan(\frac{\sum I_i(x,y) * sin(\delta_i)}{\sum I_i(x,y)*cos(\delta_i)}) tan(ψ(x,y))=−bc=−∑Ii(x,y)∗cos(δi)∑Ii(x,y)∗sin(δi)⇒ψ(x,y)=−atan(∑Ii(x,y)∗cos(δi)∑Ii(x,y)∗sin(δi))
上面的推导过程是基于最小二乘法思想,所以,理论上相移步数越多越好,有利于抑制系统随机白噪声。但是对于系统噪声,比如条纹非正线性,条纹存在高阶谐波,上面公式推导过程中的系数矩阵将不再是对角阵,则会引入系统周期性噪声。
这里的条纹非正线性指的是相移条纹在时间轴上的非正线性,而不是空间上的非正线性,因为从公式可知,像素之间的相位是相互独立的,互不影响。所以,空间上的非正线性,比如因光照不均匀导致条纹图案部分对比度下降,不影响相位精度(如果系统非常理想,低对比度条纹不会降低信噪比的话)。
相位误差分析
上面的从条纹光强提取相位的推导过程中可得出相位误差主要有以下几个:
- 系统随机噪声
系统随机噪声总是存在的,投影仪和CCD在不同的灰度级下响应不同,实际投射条纹时,避免条纹过亮或过暗,尽量让灰度级分布在中间区域(对比度高,黑白分明),避免灰度集中在一个较小的范围内(对比度低)。为了达到上述的拍摄条件,需要仔细设计条纹周期。还可以使用更好的硬件设备,从根源上降低系统随机噪声。
- 条纹非正线性,即非标准正弦条纹
条纹非正线性主要由于投影仪和CCD相机的非线性响应引起的,如下图所示。
-
量化误差
上面所有的公式推导在数学意义上是连续的,但是实际投影仪和相机都会把条纹灰度值量化为0~255的灰度整数值,比如某个像素的实际灰度值为125.6,然后就被相机量化为125,从而引入误差。一般而言,量化误差可以忽略不计。 -
其他误差
我看很多文献都提到相移误差,其实现在都是数字化生成正弦条纹了,相移误差不存在。