Как вычислить видимые границы для сенсора Asus Xtion Pro Live

У меня есть базовая настройка с использованием датчика Asus Xtion Pro Live, когда датчик подвешен на 3 м над землей и смотрит прямо вниз. Я пытаюсь определить видимые границы в метрах.

Вот диаграмма, чтобы проиллюстрировать это:Настройка датчика Asus над землей

Я знаю 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 для измерения: отметка двух точек, получение трехмерных координат и вычисление расстояния.

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,3 м. Мои предположения неверны? Если так, что я делаю неправильно / как правильно рассчитать это?

Я также использовал тег Kinect, потому что тот же принцип применим и к датчику Kinect.

2 ответа

Может быть удобнее рассчитать это в 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

Сначала вы должны преобразовать градусы в радианы:

tan(29 degrees)=tan(0.5061 rad)=0.5543.

Таким образом, opposite=0.5543*3m=1.663mи горизонтальная видимая граница 2*opposite=3.33m

Таким образом, эмпирическое правило, упомянутое выше, является хорошей оценкой (3m*1.1=3.3m).

Другие вопросы по тегам