#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:
То, что вы пытаетесь сделать, называется вычислением азимута. Если вы заинтересованы в этом для навигационных или географических целей и нуждаетесь в глубоком понимании этого, вы можете начать здесь:
В противном случае вы могли бы поискать библиотеку для вычисления азимутальных баз по 3d координатам