我使用Asus Xtion Pro Live sensor进行基本设置,传感器悬挂在地面3米处直视下方。我正在努力计算米的可见界限。
这是一个说明这一点的图表:
我知道FOV角度:
Field of View
58° H, 45° V, 70° D (Horizontal, Vertical, Diagonal)
我虽然使用了一点触发来解决它。 如果我拿HFOV,它的一半,并想象形成的直角三角形, 我可以使用切线(相反/相邻),知道角度来确定相反的一面:
opposite = adjacent * tan(29)
opposite = 3m * tan(29)
opposite ~= 2.66m
为了测试,我还使用Processing和SimpleOpenNI组合了一个非常基本的程序来测量:标记两个点,获取3D坐标并计算距离。
import SimpleOpenNI.*;
SimpleOpenNI ni;
PVector m1,m2,p1,p2;
PVector[] realWorldMap;
void setup(){
size(640,480);stroke(0,192,0);
ni = new SimpleOpenNI(this);
if(!ni.enableDepth()) exit();
ni.alternativeViewPointDepthToImage();
}
void draw(){
ni.update();
realWorldMap = ni.depthMapRealWorld();
image(ni.depthImage(),0,0);
if(m1 != null && m2 != null) line(m1.x,m1.y,m2.x,m2.y);
if(p1 != null && p2 != null) text("distance :"+(int )(p1.dist(p2)*.1)+" cm",5,15);
}
void mouseReleased(){
if(!keyPressed){
m1 = new PVector(mouseX,mouseY);
p1 = realWorldMap[mouseY*640 + mouseX];
}else{
m2 = new PVector(mouseX,mouseY);
p2 = realWorldMap[mouseY*640 + mouseX];
}
}
void keyPressed(){
if(key == ' ') m1 = m2 = p1 = p2 = null;
}
我有~2.6作为最宽的测量,但我有点困惑,因为我认为对面只是截头体的基部宽度的一半,所以期待~5.3m。我的假设是错的吗?如果是这样,我做错了什么/计算这个的正确方法是什么?
我还使用了Kinect标签,因为同样的原理适用于kinect传感器
答案 0 :(得分:1)
在Excel或OpenOffice Calc中计算它可能更方便。
根据经验,Kinect的水平视野(作为线性宽度)约为传感器距离的1.1倍。更不精确的是,距传感器给定距离D处的图像宽度与距离D相同,特别是如果您合并了颜色和深度图像并且边缘周围有黑色深度像素。
D = distance from sensor
theta = angular field of view of Kinect = 57 degrees
tangent (angle) = opposite/adjacent
tan (theta/2) = (ImageWidth/2) / D
D * tan (theta/2) = ImageWidth/2
2 * D * tan (theta/2) = ImageWidth
ImageWidth(D) = 2D * tan(28.5 degrees)
例如,
ImageWidth(1.0m) = 2 (1.0) * tan(28.5 degrees) = 2 * (1.0) * 0.543 = 1.08m
答案 1 :(得分:1)
您应首先将度数转换为弧度:
tan(29 degrees)=tan(0.5061 rad)=0.5543.
因此,opposite=0.5543*3m=1.663m
水平可见边界为2*opposite=3.33m
因此,上面提到的经验法则是一个很好的估计(3m*1.1=3.3m
)。