Вращение 3D-изображения в python

у меня есть следующее изображение I1. Я не поймал его. Я загрузил его из Google

enter image description here

я применяю известную гомографию h к I1 для получения следующего изображения I2.

enter image description here

я хочу предположить, что камера сделала этот снимок выше I2. Я нашел матрицу камеры этой "камеры". Пусть эта матрица камеры будет k. Теперь я хочу повернуть это изображение I2 о камере ось. Согласно объяснению в принятом ответе в этот вопрос, мне нужно установить матрицу вращения R, а затем выполнить k*R*inv(k)*h на изображении I1, чтобы получить требуемое повернутое изображение I3.

я сталкивался с проблемами, когда я пытаюсь установить эту матрицу вращения R. я использовал этот метод установить матрицу Р.

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

мой частичный код Python:

theta_in_degrees = 10
theta_in_radians = theta_in_degrees*math.pi/180
ux=0.0 
uy=0.0 
uz=1.0 
vector_normalize_factor = math.sqrt(ux*ux+uy*uy+uz*uz)
ux=ux/vector_normalize_factor
uy=uy/vector_normalize_factor
uz=uz/vector_normalize_factor
print "ux*ux+uy*uy+uz*uz = ", ux*ux+uy*uy+uz*uz 
rotation_matrix = np.zeros([3,3])
c1 = math.cos(theta_in_radians)
c2 = 1-c1
s1 = math.sin(theta_in_radians)
rotation_matrix[0][0] = c1+ux*ux*c2
rotation_matrix[0][1] = ux*uy*c2-uz*s1
rotation_matrix[0][2] = ux*uz*c2+uy*s1
rotation_matrix[1][0] = uy*ux*c2+uz*s1
rotation_matrix[1][1] = c1+uy*uy*c2
rotation_matrix[1][2] = uy*uz*c2-ux*s1
rotation_matrix[2][0] = uz*ux*c2-uy*s1
rotation_matrix[2][1] = uz*uy*c2+ux*s1
rotation_matrix[2][2] = c1+uz*uz*c2
print "rotation_matrix = ", rotation_matrix
R = rotation_matrix
#Calculate homography H1 between reference top view and rotated frame
k_inv = np.linalg.inv(k)
Hi = k.dot(R)
Hii = k_inv.dot(h)
H1 = Hi.dot(Hii)
print "H1 = ", H1
im_out = cv2.warpPerspective(im_src, H1, (im_dst.shape[1],im_dst.shape[0]))

здесь img_src источник И1.

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

0.00003

enter image description here

0.00006

enter image description here

0.00009

enter image description here

почему вращение работает только для таких малых значений theta_in_degrees? Кроме того, вращение видимого изображения на самом деле не происходит вокруг оси Z. Почему изображение не вращается вокруг оси z? Где я ошибаюсь и как я могу исправить это? проблемы?

сек матрица:

[[  1.71025842e+00  -7.51761942e-01   1.02803446e+02]
 [ -2.98552735e-16   1.39232576e-01   1.62792482e+02]
 [ -1.13518150e-18  -2.27094753e-03   1.00000000e+00]]

матрицы K:

[[  1.41009391e+09   0.00000000e+00   5.14000000e+02]
 [  0.00000000e+00   1.78412347e+02   1.17000000e+02]
 [  0.00000000e+00   0.00000000e+00   1.00000000e+00]]

Edit:

после включения предложения Тоби Коллинза я установил верхнее левое значение k чтобы быть таким же, как k[1][1]. Когда я теперь выполняю вращение вокруг оси z, я получаю правильные повернутые изображения для всех значений theta_in_degrees от 0 до 360. Однако, когда я пытаюсь повернуть изображение вокруг оси y, изменив ux, uy и uz в приведенном выше коде на после этого я получаю абсурдные результаты вращения:

ux=0.0 
uy=1.0 
uz=0.0 

некоторые образцы для различных значений theta_in_degrees и показаны соответствующие результаты для вращения вокруг оси y ниже:

-10

enter image description here

-40

enter image description here

-90

enter image description here

-110

enter image description here

где я все еще ошибаюсь? Кроме того, почему существует такое огромное падение длины и ширины последовательных желтых полос на повернутом изображении? И почему часть изображения обернута вокруг (например, результаты поворота -90 до -110 градусов)?

вторая часть моего вопроса такова: векторное уравнение моей оси вращения (320, 0, -10)+t(0, 1, 0). Для того, чтобы использовать этот метод, чтобы вычислить матрицу вращения, мне нужно определить ux, uy и uz оси вращения такой, что ux^2+uy^2+uz^2=1. Это было бы просто, если вращение должно выполняться вокруг одной из координатных осей (как я сейчас делаю для тестирования нужда.) Но как получить эти значения ux, uy и uz если t в векторном уравнении моей оси вращения переменной? Я также открыт для предложений относительно любых других подходов к поиску подходящей матрицы вращения R, такой, что вращение происходит вокруг оси, о которой я упомянул (скажем, на x градусов).

1 ответов


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

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

техническая цель

Так давайте проясним техническую цель. У вас есть изображение сверху вниз плоской поверхности (также называемое исправлено вид). Обычно вы называете эту поверхность модель, определенный на плоскости z=0. Вы хотите отобразить эту модель. Конкретно вы хотите сделать следующее:

  1. создается виртуальная перспективная камера, которая смотрит на модель с определенной точки зрения. Мы определяем это жесткое преобразование модели в камеру с помощью R1, t1, с внутренней матрицы K.
  2. камера перемещается, вращая ее вокруг своего центра проекции. Обозначим это вращение через R2.
  3. модель отображается с помощью представления из 2. Назовем это изображение И2

для простоты я собираюсь использовать T (R,t) для обозначения однородного жесткого преобразования 4x4 для некоторого вращения R и перевод t. The модель-для-камеры преобразование на этапе поэтому 3 дается T =T ( R2, (0,0,0)) x T (R1, t1).

опции отображения

есть два хороших способа создания И2

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

  2. определите матрицу гомографии модель-изображение и рендеринг с OpenCV с помощью warpPerspective. Преимущество этого заключается в том, что это можно сделать в нескольких строках без взлома программного обеспечения для рендеринга. Недостатком является то, что вы можете получить некоторые странные эффекты, если гомография имеет исчезающую точку в рендеринге (как вы наблюдаете). Больше по этому вопросу позже.

определение гомографии модели к изображению

чтобы использовать подход OpenCV, мы определяем модель-к-изображения фонетическое письмо как H2. Это можно определить в терминах параметров камеры. Рассмотрим пункт p=(x,y,1) на плоскости модели в однородных координатах. Его положение q в I2 в однородных координатах определяется q=K M p, где M - это. Матрица 3x3, заданная M=(T00,T01,T03; T10,T11,T13; T20,T21,T23). Это легко получить, используя модель перспективной камеры. Следовательно, теперь у нас есть это H2 =K M.

создать экземпляр матрицы гомографии

теперь мы должны создать экземпляр гомографии, в отличие от вашего предлагаемого подхода, я бы определил его с помощью определенной конфигурации камеры, указав K, R1, t1, R2. Выбор за вами! Чтобы упростить определение K вы можете использовать простую форму с одним свободным параметром (фокусное расстояние) и установить основную точку в центр изображения. Для типичных камер f варьируется от 0,5 до 2 раз по ширине изображения, но это зависит от вас. Затем вам нужно установить R1 и t1 в зависимости от угла обзора/расстояние, которое вы хотите для вашей точки зрения.

чем это отличается от вашего текущего подходи!--12-->

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