1.项目介绍
利用三维点云对线激光采集的数据进行分析,并对其中凹陷部分进行测量。如下为单线分析。主要目标是测量凹槽到下端平面的距离。
2.运用到的知识点
2.1.最小二乘三维平面拟合
数据点云是通过双目相机对打在目标上的线激光匹配得到的结果,也就是说激光的切面不在XOZ或XOY平面内,为了方便数据分析,将三维点云投影到线激光平面。
通过最小二乘拟合,可以通过采样数据点得到平面方程:
z
=
A
x
+
B
y
+
C
z = Ax + By + C
z=Ax+By+C
公式推导参考:最小二乘解
//m为采样数据数,大于等于3
Matrix<double> A = new DenseMatrix(m, 3);
Matrix<double> b = new DenseMatrix(m, 1);
int row = 0;
for (int i = 0; i < points.Count; i++)
{
List<float3> line = points[i];
//将每个点录入矩阵
for (int j = 0; j < line.Count; j++)
{
float3 value = line[j];
A[row, 0] = value.x;
A[row, 1] = value.y;
A[row, 2] = 1;
b[row, 0] = value.z;
row++;
}
}
Matrix<double> AT = A.Transpose();
m_planeMatrix = (AT * A).Inverse() * AT * b;
2.2.直线方程
已知直线上两点求直线的一般式方程(一般式支持所有情况,计算机图形处理最常用)。
两点:
P
1
(
x
1
,
y
1
)
,
P
2
(
x
2
,
y
2
)
P_1(x_1,y_1) ,P_2(x_2,y_2)
P1(x1,y1),P2(x2,y2),则直线方程式为:
A
x
+
B
y
+
C
=
0
Ax+By+C=0
Ax+By+C=0
其中:
A
=
y
2
−
y
1
A=y_2-y_1
A=y2−y1
B
=
x
1
−
x
2
B=x_1-x_2
B=x1−x2
C
=
x
2
∗
y
1
−
x
1
∗
y
2
C=x_2*y_1-x_1*y_2
C=x2∗y1−x1∗y2
点
P
(
x
0
,
y
0
)
P(x_0,y_0)
P(x0,y0)到直线的距离为:
d
=
∣
A
x
0
+
B
y
0
+
C
∣
A
2
+
B
2
d=\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}}
d=A2+B2∣Ax0+By0+C∣
垂足
P
(
x
i
,
y
i
)
P(x_i,y_i)
P(xi,yi)为:
x
i
=
B
2
x
0
−
A
B
y
0
−
A
C
A
2
+
B
2
x_i=\frac{B^2x_0-ABy_0-AC}{A^2+B^2}
xi=A2+B2B2x0−ABy0−AC
y
i
=
A
2
y
0
−
A
B
x
0
−
B
C
A
2
+
B
2
y_i=\frac{A^2y_0-ABx_0-BC}{A^2+B^2}
yi=A2+B2A2y0−ABx0−BC
最终结果