Когда камера совершает чистое панорамирование, как я могу вычислить матрицу гомографии H между двумя изображениями.
H — матрица 3 x 3, H[0,0], H[0,1], H[1,0], H[1,1] кажется легко получить из матрицы вращений, но как насчет остальных элементов?
Теоретический фон
Учитывая матрицу камеры
Код: Выделить всё
K = np.diag([f, f, 1])
Положение центра камеры в координатах мирового пространства.
Код: Выделить всё
Tw = np.array([tx, ty, tz])
Код: Выделить всё
ITw = np.column_stack((np.eye(3), Tw))
Код: Выделить всё
P = K @ Rot @ ITw
Следуя за точками, принадлежащими плоскости Z=0 в мировых координатах, мы получаем матрицу гомографии
Код: Выделить всё
Hcalc = P[:,[0,1,3]]
Код: Выделить всё
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]])
и я могу это проверить
Код: Выделить всё
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]])
Затем
Код: Выделить всё
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. ]])
Звонок
Код: Выделить всё
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
Спасибо, что читаете меня до сих пор, и я надеюсь, что вы можете мне помочь.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ly-rotated
Мобильная версия