我使用Asus Xtion Pro Live 传感器进行了基本设置,传感器悬挂在地面以上 3m 处,直视下方。我正在尝试计算以米为单位的可见界限。
这是一个图表来说明这一点:
我知道 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 传感器