Как вычислить видимые границы для сенсора Asus Xtion Pro Live
У меня есть базовая настройка с использованием датчика Asus Xtion Pro Live, когда датчик подвешен на 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 для измерения: отметка двух точек, получение трехмерных координат и вычисление расстояния.
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
).