Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

alt text

Редактировать:Неправильная формулировка на скриншоте 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", устанавливающих один из квадратных контейнеров с гидроксидом лития в командном модуле для работы в LEM, я определил местоположение углов:

alt text

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

alt text

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

g = (79,5, -48,5, гz)

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):

Нормальный = (26,7, -114,0, -74,7)

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

alt text

я думаю, что у вас возникнет новая проблема:искажения, вносимые объективом камеры.Три точки не идеально проецируются на двумерную фотографическую плоскость.Существует сферическое искажение, из-за которого прямые линии перестают быть прямыми, равные длины перестают быть равными и нормали слегка отклоняются от нормы.

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

Новый гибкий метод калибровки камеры

Но это выше моих сил:

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

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

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

Примечание

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

Обновить

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

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

g · b = 0

и

|g| = |b|

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

alt text

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

Другие советы

Судя по всему, у вас есть три очка p1, p2, и p3 определяем плоскость, и вы хотите найти вектор нормали к плоскости.

Представляя точки в виде векторов, исходящих из начала координат, уравнение для вектора нормали было бы
n = (p2 - p1)x(p3 - p1)
(где x - перекрестное произведение двух векторов)

Если вы хотите, чтобы вектор указывал наружу от передняя часть карты, затем, следуя правилу правой руки, установите
p1 = красная точка (слева внизу)
p2 = синяя (нижняя правая) точка
p3 = зеленая (верхняя левая) точка

@ Ian Boyd...Мне понравилось ваше объяснение, только я застрял на шаге 2, когда вы сказали решить для bz.У тебя все еще были bz в вашем ответе, и я не думаю, что вам следовало бы bz в вашем ответе...

bz должно быть +/ - квадратный корень из gx2 + gy2 + gz2 - бx2 - бy2

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

gz = -(gxbx + gyby) / sqrt ( гx2 + gy2 + gz2 - бx2 - бy2 )

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

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

Просто размышляю, стоя здесь на ногах.

Вашими эффективными входными данными являются видимое отношение 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.

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top