我想使用 Google Tango 平板电脑对齐(同步)深度/颜色帧对,这样,假设两个帧具有相同的分辨率,深度帧中的每个像素对应于颜色帧中的相同像素,即,我想实现一个视网膜专题映射。如何使用最新的 C API(Hilbert Release Version 1.6)来实现这一点?对此的任何帮助将不胜感激。
4 回答
生成简单的粗 UV 坐标以将探戈点云点映射回源图像(纹理坐标) - 有关更多详细信息,请参阅上面的评论,我们已经把这个线程搞砸了,但是很好:-((语言是 C#,类是 .Net)字段视图计算 FOV 水平(真)或垂直(假)
public PointF PictureUV(Vector3D imagePlaneLocation)
{
// u is a function of x where y is 0
double u = Math.Atan2(imagePlaneLocation.X, imagePlaneLocation.Z);
u += (FieldOfView(true) / 2.0);
u = u/FieldOfView(true);
double v = Math.Atan2(imagePlaneLocation.Y, imagePlaneLocation.Z);
v += (FieldOfView() / 2.0);
v = v / FieldOfView();
return new PointF((float)u, (float)(1.0 - v));
}
马克,感谢您的快速回复。可能我的问题有点不准确。您说无法建立 2D 和 3D 图像之间的视网膜主题映射当然是正确的。真丢人。尽管如此,我需要的是一个映射,其中所有深度样本 (x_n,y_n,d_n), 1<=n<=N, N 是深度值的数量,对应于 (x_n,y_n) 中的相同像素 (x_n,y_n)同步)颜色框架。众所周知,深度传感器无法为视野中的麻烦区域提供深度信息。
您的条件之一是不可能的-如果探戈无法看到它,则无法保证探戈会为您提供视野中某物的点云测量-像素和深度帧之间也没有 1:1 的对应关系,因为深度信息是 3D
我还没有尝试过,但我们可能可以这样做:对于来自点云的每个 (X,Y,Z):
u_pixel = -(X/Z)* Fx, v_pixel = -(Y/Z)* Fy.
x = (u-cx)/Fx, y = (v-cy)/Fy.
用于失真校正(k1,k2,k2 可以来自 TangoInstrinsics 的失真 [] 部分,r = Math.sqrt(x^2 + y^2)))
x_corrected = x * (1 + k1 * r2 + k2 * r4 + k3 * r6)
y_corrected = y * (1 + k1 * r2 + k2 * r4 + k3 * r6)
然后我们可以通过使用上述公式的反转(x_raster = x_correct*Fx+ cx)将归一化的x_corrected,y_corrected转换为x_raster,y_raster