Вектор нормали трех точек

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

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

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

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

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

9
задан 3 revs, 2 users 100% 10 January 2010 в 04:29
поделиться

5 ответов

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

alt text

Edit: Word wrong in screenshot of MathCAD: "Известно": g и b являются перпендикулярными друг другу"

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

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

Если пересечь g x b, мы получим вектор нормальный к обоим:

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

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

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

Но на практике, я думаю, вам придется решить это численно, регулируя gz и bz с тем, чтобы наилучшим образом подогнать условия:

g - b = 0

и

|g| = |b|

Поскольку пиксели не являются алгебраически совершенными.

Пример

Используя картинку астронавтов "Аполлон-13", на которой для работы в ЛЭМ используется квадратная канистра гидроксида лития командного модуля, я расположил углы:

alt text

Используя их в качестве основы для X-Y плоскости:

alt text

i с помощью Photoshop записал местоположения пикселей, с положительным X вправо и положительным Y вниз (чтобы правое правило Z шло "в" картинку):

g = (79. 5, -48. 5, gz)

b = (-110.8, -62. 8, bz)

Пропуская две стартовые формулы в Excel, и используя пакет инструментов анализа для "минимизации" ошибки, скорректировав gz и bz, получилось два значения Z:

g = (79. 5, -48.5, 102.5)

b = (-110.8, -62.8, 56.2)

Что затем позволяет мне вычислить другие интересные значения.

Длина g и b в пикселях:

|g| = 138,5

|b| = 139. 2

Нормальный вектор:

g x b = (3710, -15827, -10366)

Единица измерения нормальный (длина 1):

uN = (0.1925, -0.8209, -0. 5377)

Масштабирование нормали к той же длине (в пикселях), что и g и b (138.9):

Normal = (26.7, -114.0, -74. 7)

Теперь, когда у меня есть нормальная длина, равная g и b, я нарисовал их на одной картинке:

alt text

думаю, у вас возникнет новая проблема: дисторсия, вносимая объективом камеры. Эти три точки не идеально проецируются на 2-х мерную фотоплоскость. Возникает сферическое искажение, которое делает прямые линии не прямыми, делает равные длины не равными и слегка нарушает норму.

В исследованиях Microsoft есть алгоритм, позволяющий понять, как исправить искажение камеры:

Гибкая новая техника калибровки камеры

Но это выходит за рамки моих возможностей:

Мы предлагаем новую гибкую методику, чтобы легко калибровать камеру. Это хорошо подходящий для использования без специализированного знание 3D-геометрии или компьютера видение. Техника требует только камера для наблюдения плоскостной картины показанный на нескольких (как минимум на двух) разные ориентации. Либо камера или планарный рисунок могут быть свободно передвигается. Движение не обязательно должно быть известный. Радиальная дисторсия объектива По образцу. Предлагаемая процедура состоит из раствора закрытого типа, с последующим нелинейным усовершенствованием исходя из максимальной вероятности критерий. Компьютерная симуляция и реальные данные были использованы для проверки предложенная техника, и очень хорошая получены результаты. Сравнение с классическими методами, которые используют дорогостоящее оборудование, например, двойное или в трех ортогональных плоскостях, предлагаемый Техника проста в использовании и гибка. Он продвигает 3D компьютерное зрение один шаг от лабораторных условий к в реальном мире.

У них есть образец изображения, на котором видно искажение:

alt text
(источник: microsoft.com)

Примечание

  • Вы не знаете, видите ли вы "сверху" картона, или "снизу", поэтому нормаль может быть отражена вертикально (т.е. z = -z)

Обновление

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

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

g - b = 0

и

|g| = |b|

Записывая 2-е значение как разницы ("ошибка"), вы можете сложить и то, и другое и использовать это значение как число, чтобы иметь решатель Excel minim:

alt text

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

14
ответ дан 4 December 2019 в 11:05
поделиться

Из звуков этого у вас есть три точки P 1 , P 2 , а P 3 Определение самолета, и вы хотите найти нормальный вектор в самолет.

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

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

2
ответ дан 4 December 2019 в 11:05
поделиться

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

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

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

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

Начните с карт, расположенного параллельно, параллельно на плоскости просмотра и ориентированы в «естественном» пути (I.e. Вы уважаются Верхние против нижнего и левого против правильных заданий). Мы можем добраться до всех интересных позиций карты, вращаясь со \ 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 .

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

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

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

1
ответ дан 4 December 2019 в 11:05
поделиться

Использование функции условного разрыва в Visual Studio очень полезно. Мне нравится путь он позволяет мне установить значение то, что, например, может быть встречено только в редких случаях, и оттуда я могу исследовать код дальше.

-121--1749381-

Если известно количество чисел, можно вычислить старую сумму, сложить новую и разделить на старую сумму плюс один.

$oldsum = $average * $amount;
$newaverage = ($oldsum + $newnum) / ($amount + 1);
-121--2422904-

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

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

Мы определяем x как слева направо, y как до вверх, z как от дальнего до ближнего.

Затем
x = arcsin (measuredWidth/normWidth) красно-синий
y = arcsin (measuredHeight/normHeight) красно-зеленый
z = sqrt (1,0-x ^ 2-y ^ 2)

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

0
ответ дан 4 December 2019 в 11:05
поделиться

Вы можете использовать U V, N Co-Oridnates. Установите свою точку зрения на положение «Eye» или «Camera», затем переведите свои X, Y, Z COROCTINATES на U, V, N. Оттуда вы можете определить нормали, а также перспективы и видимые поверхности, если хотите (u ', v', n '). Кроме того, имейте в виду, что 2D = 3D с z = 0. Наконец, убедитесь, что вы используете гомогенные координаты.

0
ответ дан 4 December 2019 в 11:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: