Видях много подобни въпроси, но не точно този.
Знам:
- пикселни координати (u,v) и дълбочина (d) - 4 точки
- съответстващи световни координати (x,y,z) - 4 точки
- вградена матрица K на камерата (все още не съм калибрирал, но използвах тази по подразбиране на камерата)
- външна матрица [R|t] (наричам нейната версия 4x4 M_ext)
- преобразуване от световни координатни точки X (3D) в пикселни координатни точки p (2D)
Не знам:
- преобразуване от пикселни координатни точки p (2D) + дълбочина d към световни координатни точки X (3D)
0. Вземете външна матрица:
За да получа външната матрица, използвам функцията opencvs solvePnP:
ret, rvec, tvec = cv.solvePnP(world_points, img_points, K, np.float32([]), cv.SOLVEPNP_IPPE)
Получавам външната матрица [R|t] с помощта на вектора за въртене и транслация по-горе ( Rt = np.hstack((cv.Rodrigues(rvec)[0], tvec))
).
Искам да приложа и двете преобразувания за проверка, че моята външна матрица е правилна.
1. Световната координата сочи към пикселните координати:
camera_coordinates = K * M_ext * world_coordinates
u = camera_coordinates[0] / camera_coordinates[2]
v = camera_coordinates[1] / camera_coordinates[2]
Това преобразуване работи, моите пикселни координати u, v са правилни.
2. Пикселни координати + дълбочина до световни координатни точки:
camera_coordinates = ( inv(K) * [u, v, 1] ) * d
world_coordinates = inv(M_ext) * [camera_coordinates, 1]
Това обратно преобразуване не дава моите световни координатни точки. Някой вижда ли къде ми е грешката?