Python поворот изображения вокруг оси камеры

скажем, у меня есть изображение, которое я получил после применения преобразования гомографии H к некоторому исходному изображению. Исходное изображение не отображается. Результатом гомографии H, примененной к исходному изображению, является следующее изображение:

enter image description here

Я хочу повернуть это изображение на 30 градусов вокруг подходящей оси (возможно, где будет расположена камера, если она есть), чтобы получить это изображение:

enter image description here

Как я могу применить это преобразование вращения с помощью python, если я не знаю параметров камеры? Я могу указать только Градусы, на которые я хочу повернуть изображение, и приблизительную ось, вокруг которой я хочу повернуть. Кроме того, как я могу вывести гомографию H' между исходным изображением (до гомографии) и окончательным повернутым изображением с помощью H и преобразования вращения?

2 ответов


интересная проблема. Чтобы помочь объяснить мое решение, я собираюсь определить несколько символов:

  • I1: исходное изображение.
  • И2: изображение после преобразования И1 по H.
  • I3: изображение, которое у вас есть, Преобразуя I2 вращением 3D-камеры R (который вы устанавливаете себе сами).
  • неизвестная внутренняя матрица камеры K это соответствует I2.

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

на данный момент я собираюсь предположить, что у нас есть оценка K и дайте уравнение для гомографии от I1 до I3. Это ответ на последнюю часть вашего вопроса. Наконец-то я дам ... хороший способ оценить K. Тогда у вас есть все, что вам нужно.

пусть p=(px,py) - 2D-точка в I1. Определим эту точку в однородных координатах с вектором p=(px,py,1). Аналогично пусть точка q=(qx,qy,1) - положение точки p в I3. Матрица гомографии H' что превращает p to q дано H' = K R inv (K) H. Для любого R что вы указываете, вы бы использовали это для вычисления H' затем вы можете деформировать I1 для синтеза нового представления, используя, например, функцию warpPerspective OpenCV.

вывод. мы сначала применяем H чтобы получить точку в I2. Затем мы преобразуем точку в ее положение в координатах 3D caméra с помощью inv (K). Затем мы применяем вращение R и, наконец, проект вернуться к изображению с K. Если вы не уверены в применении проективных преобразований, подобных этому, я настоятельно рекомендую углубленно читать книгу Хартли и Зиссермана "множественная геометрия вида".

вычислений K. Для этого я предлагаю хитрую стратегию, используя Статую Свободы. В частности, обратите внимание, что она стоит на платформе, которую я собираюсь считать квадратной. Это убийственный трюк! Теперь мы собираемся сделать грубую камеру калибровка с использованием квадрата. Я собираюсь предположить, что нет искажения объектива и K имеет упрощенную форму с K = [f, 0,cx;0,f, cy;0,0,1]. Это означает, что соотношение сторон равно 1 (обычно примерно для цифровых камер), а основная точка находится в центре изображения: cx=w/2 и cy=h/2, где w и h-ширина и высота изображения соответственно. Попытка оценить искажение объектива и более сложный K матрица будет очень тяжело. Объектив искажение не кажется значительным, потому что края древесины на изображениях примерно прямые, поэтому его можно игнорировать.

Итак, теперь мы собираемся вычислить f. Это будет сделано с помощью плоской калибровки камеры. Известная ссылка для этого Чжан: гибкий новый метод для тарировки камеры, расположенный на https://www.microsoft.com/en-us/research/publication/a-flexible-new-technique-for-camera-calibration/

Как это будет работать сначала нужно щелкнуть по 4 углам четырех видимых углов плоскости статуи в I2 (см. прикрепленное изображение). Назовем эти p1 p2 p3 и p4, начиная снизу влево и двигаясь по часовой стрелке. Затем вы можете использовать методы калибровки камеры OpenCV, чтобы получить оценку K из этих 4-х угловых точек. Важно отметить, что причина, по которой мы можем это сделать, заключается в том, что мы знаем, что платформа квадратная. Для более глубокого понимания калибровки на основе плоскости я рекомендую прочитать статью Чжана. Если ты ... испытывая трудности, я мог бы сделать это сам за пару минут и отправить K матрица.

four corner points on the statue's square stand

в качестве конечной точки небольшое изменение этого подхода заключается в калибровке с использованием исходного изображения (при условии, что оно все еще у вас есть). Причина этого в том, что H может исказить I2 так, чтобы его соотношение сторон не было близко к 1, а основная точка не находилась рядом с центром изображения. При калибровке с использованием исходного изображения (назовем матрицу K1), то вы должны использовать K = H K1.


чтобы применить гомографию, я бы рекомендовал использовать OpenCV, более конкретно warpPerspective функция https://docs.opencv.org/3.0-beta/modules/imgproc/doc/geometric_transformations.html#warpperspective

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

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