math - 如何计算 Asus Xtion Pro Live 传感器的可见边界

标签 math computer-vision kinect trigonometry asus-xtion

我已经使用 Asus Xtion Pro Live sensor 进行了基本设置传感器悬卡在距地面 3m 处,直视下方。我正在尝试计算出以米为单位的可见边界。

这是一个图表来说明这一点: Asus sensor setup above ground

我知道 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 传感器

最佳答案

在 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

关于math - 如何计算 Asus Xtion Pro Live 传感器的可见边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14854107/

相关文章:

javascript - 计算数字落入的范围

C#图像识别

virtualbox - 无论如何要在虚拟机上运行 Kinect?

python - 截断 pandas df 中值的小数位

math - 如何通过系统测量事件发生率

java - 我们如何写出模拟时钟的角度表达式?

matlab - 任何人都可以建议用于面部身份验证的良好照明归一化算法。我尝试过基本算法,如 DoG、LBP、..?

matlab - 了解 Matlab stereoCameraCalibrator 上的外部立体参数(旋转)

processing - 使用 Kinect 运动传感器动态时间扭曲来检测手势

c++ - Kinect 4 Windows v2 - 打开录音