Определить матрицу преобразования

В продолжение моего предыдущего вопроса об определении параметров камеры я сформулировал новая проблема.

У меня есть две картинки одного и того же прямоугольника:

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

На втором изображении показан прямоугольник после применения некоторого трехмерного преобразования (XYZ-вращение, масштабирование, XY-перемещение). Это заставило прямоугольник выглядеть трапециевидным.

Надеюсь, следующая картинка описывает мою проблему:

http://wilco.menge.nl/application.data/cms/upload/transformation%20matrix.png

Как определить, какие преобразования (точнее: какая матрица преобразования) вызвали эту трансформацию?

Я знаю расположение углов в пикселях на обоих изображениях, следовательно, я также знаю расстояния между углами.


person dwergkees    schedule 13.07.2009    source источник


Ответы (4)


Я смущен. Это проблема 2д или 3д?

Насколько я понимаю, у вас есть плоский прямоугольник, внедренный в трехмерное пространство, и вы смотрите на две его двухмерные «картинки» - одну из исходной версии, а другую - на основе преобразованной версии. Это правильно?

Если это правильно, значит, информации для решения проблемы недостаточно. Например, предположим, что две картинки выглядят совершенно одинаково. Это может быть связано с тем, что перевод является идентичностью, или потому, что перевод перемещает прямоугольник вдвое дальше от камеры и удваивает его размер (таким образом, он выглядит точно так же).

person Alex319    schedule 13.07.2009
comment
Это трехмерная проблема. Первое изображение представляет собой эталонное изображение прямоугольника в масштабе 1: 1. Второй можно рассматривать как снимок прямоугольника, сделанный фотоаппаратом. Я понимаю вашу точку зрения, что есть больше решений (больше матриц преобразования) для конкретного случая. В таком случае я с радостью выберу любого из них. (В описанной вами ситуации я был бы счастлив либо с единичной матрицей, либо с любой матрицей, дающей такой же результат) - person dwergkees; 14.07.2009

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

вам нужно определить набор уравнений (ваша матрица преобразования, я предполагаю, это 3 уравнения), а затем решить его для 4 преобразований угловых точек.

Я когда-либо описывал это только немецкими словами ... так что вышесказанное будет звучать странно ...

person lexu    schedule 13.07.2009

Судя по имеющейся у вас информации, это не так просто. Однако я дам вам несколько идей, с которыми можно поиграть. Если бы у вас были трехмерные координаты углов, вам было бы легче. Вот основная идея.

  1. Переместите угол в начало координат. После этого произойдут вращения относительно начала координат.
  2. Определите векторы осей. Сделайте это, вычтя смежные углы из исходной точки. Это будут локальные оси x и y для вашего мира.
  3. Определите углы с помощью векторов. Вы можете использовать точечные произведения и перекрестные произведения, чтобы определить угол между локальной осью x и глобальной осью x (1, 0, 0).
  4. Поверните на угол на шаге 3. Это даст вам новую ось x, которая должна соответствовать глобальной оси x и новой локальной оси y. Затем вы можете определить другое вращение вокруг оси x, которое приведет к выравниванию оси y с глобальной осью y.

Без координат z вы можете видеть, что это будет сложно, но это общий процесс. Надеюсь, это поможет.

person Community    schedule 13.07.2009

Как отмечает Alex319, решение не будет уникальным.

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

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

Поверните трапецию, пока ее параллельные стороны не станут параллельны двум сторонам исходного прямоугольника. (Какие два? Неважно.)

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

Теперь о вращении вне плоскости. Измерьте расстояние от центра до одной из параллельных сторон и воспользуйтесь законом синусов.

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

person Community    schedule 13.07.2009