Нормальный вектор из трех точек - PullRequest
9 голосов
/ 10 января 2010

Эй, математики, у меня есть проблема, которая меня озадачила некоторое время. Это для личного проекта.

У меня есть три точки: красная, зеленая и синяя. Они расположены на картонном листе так, что красная точка находится в левом нижнем углу (0,0), синяя точка находится в правом нижнем углу (1,0), а зеленая точка находится в левом верхнем углу. Представьте, что вы делаете шаг назад и фотографируете карту под углом. Если бы вы нашли центр каждой точки на рисунке (скажем, единицы измерения - пиксели), как бы вы нашли нормальный вектор лица карты на изображении (относительно камеры)?

Теперь несколько вещей, которые я поднял об этой проблеме:

  1. Точки (в «реальной жизни») всегда под прямым углом. На картинке они только под прямым углом, если камера вращается вокруг красной точки вдоль «оси» (ось - линия, созданная красными и синими или красными и зелеными точками).
  2. Точки есть только на одной стороне карты. Таким образом, вы знаете, что никогда не будете смотреть на него сзади.
  3. Расстояние от карты до камеры не имеет значения. Если бы я знал глубину каждой точки, это было бы намного проще (просто простой перекрестный продукт, нет?).
  4. Вращение карты не имеет отношения к тому, что я ищу. В том, как я пытался разобраться с этим, я могу найти вращение с помощью вектора нормали в конце. Мне неизвестно, является ли вращение частью (или продуктом) нахождения вектора нормалей.

Надеюсь, есть кто-то, кто либо сделал это, либо является математическим гением. У меня есть двое моих друзей, которые помогают мне в этом, и мы - пока что - безуспешно.

Ответы [ 6 ]

14 голосов
/ 15 января 2010

Я работал в моей старой версии MathCAD:

alt text

Редактировать: неверная формулировка на скриншоте MathCAD: «Известно: g и b перпендикулярны друг другу»

В MathCAD я забыл последний шаг создания кросс-продукта, который я скопирую сюда из моего предыдущего ответа:

Теперь мы решили для X-Y-Z переведенные точки g и b, ваш оригинальный вопрос хотел нормальный самолет.

Если крестик г х б , мы получим вектор нормали к обоим:

        | u1  u2  u3 |
g x b = | g1  g2  g3 |
        | b1  b2  b3 |  

      = (g2b3 - b2g3)u1 + (b1g3 - b3g1)u2 + (g1b2 - b1g2)u3

Все значения известны, подключите их (я не буду выписывать версию с g3 и заменили b3, так как это просто слишком долго и некрасиво, чтобы быть полезным.

Но с практической точки зрения, я думаю, вам придется решать ее численно, настраивая г z и b z так как лучше всего соответствовать условиям:

г · b = 0

и

| г | = | b |

Так как пиксели не идеальны алгебраически.

Пример * * один тысяча шестьдесят-один Используя изображение астронавтов Аполлона-13, оснащающего одну из квадратных канистр гидроксида лития для командного модуля, для работы в LEM, я расположил углы: alt text Использование их в качестве основы для плоскости X-Y: alt text Я записал пиксельные местоположения с помощью Photoshop, с положительным X справа и положительным Y вниз (чтобы сохранить правило правой руки Z, переходящее « в » изображение): г = (79,5, -48,5, г z ) b = (-110,8, -62,8, b z ) Перетаскивание двух начальных формул в Excel и использование пакета инструментов анализа для « минимизации » ошибки путем корректировки g z и b z , он получил два значения Z: г = (79,5, -48,5, 102,5) b = (-110,8, -62,8, 56,2) Который затем позволяет мне вычислить другие интересные значения. Длина г и b в пикселях: | г | = 138,5 | б | = 139,2 Нормальный вектор: г х б = (3710, -15827, -10366) Единица нормальная (длина 1): u N = (0,1925, -0,8209, -0,5377) Масштабирование от нормальной до той же длины (в пикселях), что и г и b (138,9): Нормальный = (26,7, -114,0, -74,7) Теперь, когда у меня есть нормаль, которая имеет ту же длину, что и g и b , я нанес их на ту же картинку: alt text Я думаю, у вас возникнет новая проблема: искажение, вносимое объективом камеры. Три точки не идеально проецируются на двухмерную фотографическую плоскость. Имеется сферическое искажение, из-за которого прямые линии перестают быть прямыми, равные длины перестают быть равными, а нормали слегка отклоняются от нормы. В исследовании Microsoft есть алгоритм, позволяющий выяснить, как исправить искажения камеры: Гибкая новая методика калибровки камеры Но это вне меня: Мы предлагаем гибкую новую технику для легко откалибровать камеру. Это хорошо подходит для использования без специализированных знание 3D геометрии или компьютера видение. Техника требует только камера для наблюдения плоской картины показано на несколько (как минимум два) разные ориентации. Либо камера или плоская картина может быть свободно перемещается. Движение не должно быть известен. Радиальное искажение линзы смоделированы. Предлагаемая процедурасостоит из решения в закрытой форме, с последующим нелинейным уточнением исходя из максимальной вероятности критерий. Обе компьютерные симуляции и реальные данные были использованы для проверки предложенная техника и очень хорошая результаты были получены. По сравнению с классическими техниками, которые используют дорогое оборудование, такое как два или три ортогональные плоскости, предлагаемые Техника проста в использовании и гибка. Это продвигает 3D компьютерное зрение один перейти от лабораторных условий к использование в реальном мире. У них есть образец изображения, где вы можете увидеть искажение: alt text
(источник: microsoft.com ) Примечание вы не знаете, видите ли вы "верх" картона или "низ", поэтому нормаль может быть отражена вертикально (т.е. z = -z) Обновление

Гай обнаружил ошибку в производных алгебраических формулах. Исправление приводит к формулам, которые, я думаю, имеют простую замкнутую форму. Это не так уж плохо, так как это не может быть решено точно так или иначе; но численно.

Вот скриншот из Excel, где я начинаю с двух известных правил:

г · б = 0

и

| г | = | b |

Записав 2-е как разность (сумму «ошибки»), вы можете сложить и использовать это значение как число, чтобы иметь решатель Excel минимизировать :

alt text

Это означает, что вам придется написать свой собственный числовой итерационный решатель. я смотрю на мой Численный метод для инженеров учебник из университета; я знаю, что он содержит алгоритмы для решения рекурсивных уравнений без простой замкнутой формы.

2 голосов
/ 15 сентября 2010

@ Ян Бойд ... Мне понравилось ваше объяснение, только я застрял на шаге 2, когда вы сказали, что нужно решить для b z . У вас все еще было b z в вашем ответе, и я не думаю, что вы должны иметь b z в своем ответе ...

b z должен иметь +/- квадратный корень из г x 2 + g y 2 + г z 2 - b x 2 - b y 2

После того, как я сделал это сам, мне было очень трудно подставить b z в первое уравнение, когда вы решили для g z , потому что при замене b z , теперь вы получите:

г z = - (г х б х + г у б у ) / квт (г х 2 + г у 2 + г z 2 - b x 2 - b y 2 )

Часть, которая делает это трудным, состоит в том, что в квадратном корне есть g z , поэтому вы должны отделить его и объединить g z вместе, и решить для г z Что я и сделал, только я не думаю, что способ, которым я решил, был правильным, потому что, когда я писал свою программу для расчета г г для меня я использовал ваши г х и г у значения, чтобы увидеть, если мой ответ совпадает с вашим, и это не так.

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

2 голосов
/ 10 января 2010

По звукам у вас есть три точки p 1 , p 2 и p 3 определяя плоскость, и вы хотите найти вектор нормали к плоскости.

Представляя точки как векторы от начала координат, уравнение для нормального вектора будет иметь вид
n = ( p 2 - p 1 ) x ( p 3 - p 1 )
(где х - это произведение двух векторов)

Если вы хотите, чтобы вектор указывал наружу от передней карты, тогда для правила правой руки установите
p 1 = красная (нижняя левая) точка
p 2 = синяя (нижняя правая) точка
p 3 = зеленая (верхняя левая) точка

1 голос
/ 10 января 2010

Просто думаю о моих ногах здесь.

Ваши эффективные входные данные - это кажущееся отношение RB / RG [+], видимый угол BRG и угол, который (скажем) RB делает с вашей координатой экрана y (я что-то пропустил). Вы нуждаетесь в компонентах нормализованного нормального (хе!) Вектора, который, как я полагаю, представляет собой только два независимых значения (хотя у вас осталась бы двусмысленная спереди, если карта просвечивает). [++]

Так что я предполагаю, что это возможно ...

С этого момента я работаю в предположении, что видимый угол RB всегда равен 0, и мы можем повернуть окончательное решение вокруг оси z позже.

Начните с карты, расположенной параллельно плоскости просмотра и ориентированной «естественным» образом (т.е. вы выполняете задания сверху вниз и слева и справа). Мы можем достичь всех интересных позиций карты, повернув \theta вокруг начальной оси x (для -\pi/2 < \theta < \pi/2), затем повернув на \phi вокруг начальной оси y (для -\pi/2 < \phi < \pi/2). Обратите внимание, что мы сохранили видимое направление вектора RB.

На следующем шаге вычисляется видимое соотношение и видимый угол после в терминах \theta и \phi и инвертируется результат. [+++]

Нормальным будет R_y(\phi)R_x(\theta)(0, 0, 1) для R_i примитивной матрицы вращения вокруг оси i.

[+] Абсолютные длины не учитываются, потому что это просто говорит о расстоянии до карты.

[++] Еще одно предположение: расстояние от карты до плоскости просмотра намного больше, чем размер карты.

[+++] Здесь важна проекция, которую вы используете из трехмерного пространства на плоскость просмотра. Это сложная часть, но мы не сможем помочь вам, если вы не скажете, какую проекцию вы используете. Если вы используете настоящую камеру, то это перспективная проекция, которая рассматривается практически в любой книге по трехмерной графике.

0 голосов
/ 21 января 2010

Вы можете использовать u, v, n co-oridnates. Установите точку обзора в положение «глаза» или «камеры», затем переведите координаты x, y, z в u, v, n. Оттуда вы можете определить нормали, а также перспективу и видимые поверхности, если хотите (u ', v', n '). Также имейте в виду, что 2D = 3D с z = 0. Наконец, убедитесь, что вы используете однородные координаты.

0 голосов
/ 10 января 2010

верно, вектор нормали не изменяется по расстоянию, но проекция картона на картинку не меняется по расстоянию (Простой: если у вас маленький картон, ничего не изменится. Если у вас есть картон шириной 1 милю и высотой 1 милю, и вы поворачиваете его так, чтобы одна сторона была ближе, а другая - дальше, ближняя сторона увеличивается, а дальняя сторона укорачивается на снимке. Вы сразу видите, что прямоугольник не остается прямоугольником, а является трапецией)

Наиболее точный способ для малых углов и камеры, центрированной по центру, состоит в измерении соотношения ширины / высоты между "нормальным" изображением и углом изображения на средних линиях (потому что они не деформированы).

Мы определяем x как слева направо, y как сверху вниз, z как далеко и близко.

Тогда
x = арксинус (измеренная ширина / нормальная ширина) красно-синий
y = arcsin (измеренная высота / нормальная высота) красно-зеленый
z = sqrt (1,0-х ^ 2-у ^ 2)

Завтра я найду более точное решение, но я слишком устала ...

...