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

Программы на Python
Ответить
Anonymous
 Вычислить гомографию между двумя изображениями, когда камера просто вращается

Сообщение Anonymous »

Последний вопрос:
Когда камера совершает чистое панорамирование, как я могу вычислить матрицу гомографии H между двумя изображениями.
H — матрица 3 x 3, H[0,0], H[0,1], H[1,0], H[1,1] кажется легко получить из матрицы вращений, но как насчет остальных элементов?
Теоретический фон
Учитывая матрицу камеры

Код: Выделить всё

K = np.diag([f, f, 1])
f — фокусное расстояние камеры.
Положение центра камеры в координатах мирового пространства.

Код: Выделить всё

Tw = np.array([tx, ty, tz])
мы создаем ITw

Код: Выделить всё

ITw = np.column_stack((np.eye(3), Tw))
мы можем вычислить проективную матрицу

Код: Выделить всё

P = K @ Rot @ ITw
где Rot — матрица вращения 3x3
Следуя за точками, принадлежащими плоскости Z=0 в мировых координатах, мы получаем матрицу гомографии

Код: Выделить всё

Hcalc = P[:,[0,1,3]]
Rot определяется как

Код: Выделить всё

from scipy.spatial.transform import Rotation as R
pan = 10
tilt = -30
roll = 4

pan *= np.pi / 180
tilt *= np.pi / 180
roll *= np.pi / 180

r_pan = R.from_euler('Z', pan).as_matrix()
r_tilt = R.from_euler('X', tilt).as_matrix()
r_roll = R.from_euler('Z', roll).as_matrix()

Rot = r_roll @ r_tilt @ r_pan
Иллюстрация с примером
В качестве примера я беру f = 400 и Tw= [10 , -5 , 6 ] и набор исходных точек на земле, я даю только координаты X и Y как Z = 0

Код: Выделить всё

src_pts = np.array([
[ 0.  , -7.62],
[ 0.  , -6.35],
[ 0.  ,  0.  ],
[ 0.  ,  1.27],
[ 0.  ,  2.54],
[ 0.  ,  3.81],
[20.  , -7.62],
[20.  , -6.35],
[20.  ,  0.  ],
[20.  ,  1.27],
[20.  ,  2.54],
[20.  ,  3.81]])
Я могу вычислить Pts10 точек изображения на экране для этих точек с помощью Hcal
и я могу это проверить

Код: Выделить всё

h10, status = cv2.findHomography(src_pts.reshape(-1,1,2), pts10.reshape(-1,1,2))
приводит к тому же значению
Далее я делаю то же самое с панорамированием = 15°, чтобы вычислить h15 и Pts15
Когда мне станет сложнее!
Гомография одного изображения другому задается
h, status = cv2.findHomography(pts10.reshape(-1,1,2), pts15.reshape(-1,1,2))
И я получаю

Код: Выделить всё

H
Out[187]:
array([[ 9.97147963e-01, -7.56172873e-02,  1.73592176e+01],
[ 7.54846993e-02,  9.98090883e-01,  1.87521001e+00],
[-1.09070429e-04, -3.49361263e-06,  1.00000000e+00]])
Вызов rot10 и rot15 — матрицы поворота для панорамирования = 10° и 15° соответственно
Затем

Код: Выделить всё

rot15 @ rot10.T / (rot15 @ rot10.T)[2,2]
Out[191]:
array([[ 0.99714794, -0.07561722,  0.04339806],
[ 0.0754847 ,  0.9980909 ,  0.00468803],
[-0.04362816, -0.00139744,  1.        ]])
Он показывает, как вычислить H[0,0], H[0,1], H[1,0], H[1,1]
Звонок

Код: Выделить всё

rotNorm = rot15 @ rot10.T / (rot15 @ rot10.T)[2,2]
у нас есть

Код: Выделить всё

H[i,j] = RotNorm[i,j] for i,j < 2
далее

Код: Выделить всё

H[2,j] = RotNorm[2,j] / f for j < 2
а как насчет H[0,2] и H[1,2]?
Спасибо, что читаете меня до сих пор, и я надеюсь, что вы можете мне помочь.

Подробнее здесь: https://stackoverflow.com/questions/793 ... ly-rotated
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»