深度图像上的表面法线
Surface normal on depth image
如何在不使用点云库的情况下估计深度图像(像素值以毫米为单位)上点 I(i,j) 的表面法线(PCL )?我已经完成 (1), (2), and (3) 但我正在寻找使用 C++ 标准库或 openCV 对每个像素的表面法线的简单估计。
你需要知道相机的内在参数,这样你也可以知道相同单位(mm)的像素之间的距离。这个像素之间的距离对于距离相机一定距离(即中心像素的值)显然是正确的
如果相机矩阵是 K,通常类似于:
f 0 cx
K= 0 f cy
0 0 1
然后,取一个像素坐标 (x,y),然后从相机原点通过像素(在相机世界坐标 space 中)的光线定义为:
x
P = inv(K) * y
1
根据图像中的距离是 Z 轴上的投影,还是距中心的欧几里得距离,您需要对向量 P 进行归一化,使幅度为到您想要的像素的距离,或者确保 P 的 z 分量就是这个距离。对于帧中心周围的像素,这应该接近相同。
如果你对附近的像素(比如,左边和右边)做同样的操作,你会得到以毫米为单位的 Pl 和 Pr
然后找到 (Pl-Pr) 的范数,它是相邻像素之间距离的两倍,单位为毫米。
然后,计算 X 和 Y 的梯度
gx = (Pi+1,j - Pi-1,j) / (2*pixel_size)
然后,将两个梯度作为方向向量:
ax = atan(gx), ay=atan(gy)
| cos ax 0 sin ax | |1|
dx = | 0 1 0 | * |0|
| -sin ax 0 cos ax | |0|
| 1 0 0 | |0|
dy = | 0 cos ay -sin ay | * |1|
| 0 sin ay cos ay | |0|
N = cross(dx,dy);
您可能需要查看标志是否有意义,方法是查看某个梯度并查看 dx,dy 指向预期的方向。您可能需要对 none/one/both 角使用负数,对 N 向量使用相同的负数。
如何在不使用点云库的情况下估计深度图像(像素值以毫米为单位)上点 I(i,j) 的表面法线(PCL )?我已经完成 (1), (2), and (3) 但我正在寻找使用 C++ 标准库或 openCV 对每个像素的表面法线的简单估计。
你需要知道相机的内在参数,这样你也可以知道相同单位(mm)的像素之间的距离。这个像素之间的距离对于距离相机一定距离(即中心像素的值)显然是正确的
如果相机矩阵是 K,通常类似于:
f 0 cx
K= 0 f cy
0 0 1
然后,取一个像素坐标 (x,y),然后从相机原点通过像素(在相机世界坐标 space 中)的光线定义为:
x
P = inv(K) * y
1
根据图像中的距离是 Z 轴上的投影,还是距中心的欧几里得距离,您需要对向量 P 进行归一化,使幅度为到您想要的像素的距离,或者确保 P 的 z 分量就是这个距离。对于帧中心周围的像素,这应该接近相同。
如果你对附近的像素(比如,左边和右边)做同样的操作,你会得到以毫米为单位的 Pl 和 Pr 然后找到 (Pl-Pr) 的范数,它是相邻像素之间距离的两倍,单位为毫米。
然后,计算 X 和 Y 的梯度
gx = (Pi+1,j - Pi-1,j) / (2*pixel_size)
然后,将两个梯度作为方向向量:
ax = atan(gx), ay=atan(gy)
| cos ax 0 sin ax | |1|
dx = | 0 1 0 | * |0|
| -sin ax 0 cos ax | |0|
| 1 0 0 | |0|
dy = | 0 cos ay -sin ay | * |1|
| 0 sin ay cos ay | |0|
N = cross(dx,dy);
您可能需要查看标志是否有意义,方法是查看某个梯度并查看 dx,dy 指向预期的方向。您可能需要对 none/one/both 角使用负数,对 N 向量使用相同的负数。