2D пикселни координати към 3D световни координати с помощта на opencv solvePnP

Видях много подобни въпроси, но не точно този.

Знам:

  • пикселни координати (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]

Това обратно преобразуване не дава моите световни координатни точки. Някой вижда ли къде ми е грешката?


comment
така че търсите проектиране на пиксели в 3D с известна дълбочина, вътрешни и външни характеристики? Разгледайте: stackoverflow.com/questions/31265245/ и свързания урок от Николас Буръс   -  person Micka    schedule 13.04.2021
comment
В урока те също проектират пиксел + дълбочина към 3D координати на камера по същия начин, както правя аз, но няма допълнителна трансформация от рамка на камера в друга рамка / няма външна матрица. Така че, за съжаление, това не ми помага да открия грешката си..   -  person meen    schedule 13.04.2021
comment
P3D' = R.P3D + T е трансформация от координатна система на 3d камера към глобална координатна система.   -  person Micka    schedule 13.04.2021
comment
Това правя, така че все още не виждам защо не работи. В solvePnP векторът на въртене и транслация пренася точки от координатната система на модела към координатната система на камерата, така че приложих обратното, за да стигна от координатите на камерата до глобалните координати.   -  person meen    schedule 13.04.2021
comment
добре, това е недоразумение. Координатите на модела обикновено не са равни на глобалната координатна система, освен ако не дефинирате глобалната координатна система да бъде равна на координатите на модела. Виждате ли модела на всички камери едновременно?   -  person Micka    schedule 13.04.2021
comment
Координатната система на моя модел е моята глобална координатна система (четири точки на маса, видими от камерата ми). Имам само една камера (за дълбочина) и искам да знам как да преобразувам пиксел+точка за дълбочина в моя модел/глобална координатна система.   -  person meen    schedule 14.04.2021