gpt4 book ai didi

c++ - 深度图像上的表面法线

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:34:08 25 4
gpt4 key购买 nike

如何在不使用点云库 (PCL) 的情况下估计深度图像(像素值以毫米为单位)上点 I(i,j) 的表面法线?我经历了(1) , (2) , 和 (3)但我正在使用 C++ 标准库或 openCV 寻找对每个像素表面法线的简单估计。

enter image description here

最佳答案

你需要知道相机的内在参数,这样你也可以知道相同单位(mm)的像素之间的距离。这个像素之间的距离对于距离相机一定距离(即中心像素的值)显然是正确的

如果相机矩阵是 K,通常是这样的:

    f  0  cx
K= 0 f cy
0 0 1

然后,获取像素坐标 (x,y),然后使用以下方法定义从相机原点通过像素(在相机世界坐标空间中)的光线:

              x
P = inv(K) * y
1

根据图像中的距离是 Z 轴上的投影,还是距中心的欧几里德距离,您需要对 vector P 进行归一化,使幅度为到所需像素的距离,或者确保 P 的 z 分量就是这个距离。对于框架中心周围的像素,这应该接近相同。

如果您对附近的像素(例如,左侧和右侧)执行相同的操作,您将获得以毫米为单位的 Pl 和 Pr然后找到 (Pl-Pr) 的范数,它是相邻像素之间距离的两倍,单位为毫米。

然后,计算 X 和 Y 的梯度

gx = (Pi+1,j - Pi-1,j) / (2*pixel_size)

然后,将这两个梯度作为方向 vector :

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 指向预期的方向。您可能需要对无角/一个/两个角使用负数,对 N vector 使用相同的负数。

关于c++ - 深度图像上的表面法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30993211/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com