Найти направление заданных координат x, y, z

#c #opencv

#c #opencv

Вопрос:

я новичок в opencv, и он развивается. У меня есть координаты x, y, z (0.00949334694383068, -0.3999829847985352, 0.8449078780010854), используя заданные координаты, как я мог бы найти направление.

 for an example 
input one : x,y,z =  0.00949334694383068, -0.3999829847985352, 0.8449078780010854
input two : x,y,z =   0.01603883281370779, 0.6066595296580494, 0.5342810849038371
 

Наконец, я хочу сравнить направление input_one и направление input_two. Любая помощь приветствуется

Ответ №1:

Это называется векторной математикой.

«Координаты» — это особый вид вектора относительно некоторого начала координат (в вашем случае x=0,y=0,z=0 ). По этой причине разница x1-x2, y1-y2, z1-z2 представляет собой вектор из точки 2 в точку 1. Обратное x2-x1, y2-y1, z2-z1 — это вектор из точки 1 в точку 2.

Направление вектора обычно определяется путем игнорирования его длины или, в качестве альтернативы, путем установки его длины равной единице. Итак, нам нужно сначала определить длину, которая равна L = √(x*x y*y z*z) . Мы можем определить вектор x/L, y/L, z/L , который указывает в том же направлении, что и, x,y,z но с длиной один.

Наконец, для сравнения двух направлений мы можем вычислить внутреннее произведение этих двух направлений : x1/L1 * x2/L2 y1/L1 * y2/L2 z1/L1 * z2/L2 . Если это один, они указывают в одном направлении. Если это 0, они ортогональны. Если это -1, они указывают в противоположных направлениях.

Как вы можете видеть, вектор 0,0,0 имеет длину 0 и не имеет направления. Это может немного усложнить ситуацию.

В OpenCV: класс Vec. Вызывается функция длины norm(v) и вызывается внутреннее произведение v1.mul(v2)

Комментарии:

1. MSalters это моя еще одна идея, если я возьму x amp; y и вычислю значение sin, я думаю, что смогу выбрать направление. Но для этого у меня нет хорошей идеи для уровня реализации. если бы вы могли объяснить это также, это было бы слишком полезно.

2. это моя другая идея, если я возьму x amp; y и вычислю значение sin, я думаю, что смогу выбрать направление. Но для этого у меня нет хорошей идеи для уровня реализации. если бы вы могли объяснить это также, это было бы слишком полезно

3. @RahulaCol: Нет, sin(x/y) не даст значимого результата. Вы можете использовать atan2(y,x) .

4. большое вам спасибо. я увижу функцию atan2 (y, x) в opencv.

5. @RahulaCol: это в <cmath> , иначе std::atan2 , не в OpenCV.

Ответ №2:

То, что вы пытаетесь сделать, называется вычислением азимута. Если вы заинтересованы в этом для навигационных или географических целей и нуждаетесь в глубоком понимании этого, вы можете начать здесь:

http://mobile.codeguru.com/cpp/cpp/algorithms/article.php/c5115/Geographic-Distance-and-Azimuth-Calculations.htm

В противном случае вы могли бы поискать библиотеку для вычисления азимутальных баз по 3d координатам