Math 如何基于深度信息找到平坦区域
我有一架可以自主飞行的无人机,我希望它能安全着陆。。 我有一个深度相机在它下面,现在我找不到一种方法来检测平坦区域,告诉无人机降落在上面。 我使用的是realsense D435i相机。这是一个从下向相机获得的深度图像样本 请问你能帮忙吗 根据 但是,如果使用线性输出或透视对深度帧进行后期处理,则我看不到有关深度帧的任何信息。你可以从图像中推断,如果物体随着距离变小,它仍然处于透视图中,我不知道,但假设是这样 您的图像是848x480,因此我假设它只是按Math 如何基于深度信息找到平坦区域,math,drone,depth-camera,Math,Drone,Depth Camera,我有一架可以自主飞行的无人机,我希望它能安全着陆。。 我有一个深度相机在它下面,现在我找不到一种方法来检测平坦区域,告诉无人机降落在上面。 我使用的是realsense D435i相机。这是一个从下向相机获得的深度图像样本 请问你能帮忙吗 根据 但是,如果使用线性输出或透视对深度帧进行后期处理,则我看不到有关深度帧的任何信息。你可以从图像中推断,如果物体随着距离变小,它仍然处于透视图中,我不知道,但假设是这样 您的图像是848x480,因此我假设它只是按1/1.5线性缩放,因此视野是相同的 将
1/1.5
线性缩放,因此视野是相同的
cos
corrected),因此我们需要尝试这两种组合,并选择一种效果更好的组合(建筑是长方体而不是金字塔…)
从我手边得到的信息来看,这是我能从您的输入图像中得到的最好信息:
所以我从你的图像中提取了所有像素,将x,y位置转换成球面经度,纬度
角度(从深度相机视场和图像分辨率的线性插值),然后将像素强度转换成深度,并将其转换成笛卡尔坐标
//深度->PCL
for(y=0;yScanLine[y];//指向深度图像中第y条扫描线的指针
b=深度fovy*((双(y)-深度y0)/双(ys-1))-0.5;//纬度
对于(x=x3=0;x笛卡尔坐标
p[0]=cos(a)*cos(b);//x
p[1]=sin(a)*cos(b);//y
p[2]=sin(b);//z
if(int(depthcfg&_DepthImage_cos_correct_z))r/=p[0];
pnt[y][x3+0]=r*p[1];
pnt[y][x3+1]=r*p[2];
pnt[y][x3+2]=r*p[0];
}
}
其中pnt[][]
是三维点的二维数组,存储为后续x、y、z
和:
pcl.depthz0=0.8;
pcl.depthz1=1.00;
pcl.depthcfg=_DepthImage_invert_z|_DepthImage_cos_correct_z;
图像分辨率为xs,ys
有关更多信息,请参阅:
abs
ofdot
result来处理它
,因此我们可以将该范围转换为某个位宽的无符号整数,并将其中的3个叠加为单个整数。例如,每个坐标5位:
normal = (nx,ny,nz)
nx = 31.0*(nx+1.0)*0.5; // <-1,+1> -> <0,31>
ny = 31.0*(nx+1.0)*0.5; // <-1,+1> -> <0,31>
nz = 31.0*(nx+1.0)*0.5; // <-1,+1> -> <0,31>
int ni = int(nx) + int(ny)<<5 + int(nz)<<10
其中,允许在deg
或rad
中的法线之间存在角度差,这取决于cos
实现
wx*wy
的矩形,以米为单位(或者以任何单位重建场景)
normal = (nx,ny,nz)
nx = 31.0*(nx+1.0)*0.5; // <-1,+1> -> <0,31>
ny = 31.0*(nx+1.0)*0.5; // <-1,+1> -> <0,31>
nz = 31.0*(nx+1.0)*0.5; // <-1,+1> -> <0,31>
int ni = int(nx) + int(ny)<<5 + int(nz)<<10
dot(n1,n2)/(|n1|.|n2|) >= cos(margin)