Получение координат 2D-мира (x, y) из координат пикселей (u, v)

#opencv #image-processing #computer-vision

Вопрос:

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

Ниже я делюсь изображениями, сделанными под разными углами, и кодом, который я использовал для обратного преобразования. Изображения сделаны с высоты 320 метров и предполагают все объекты в плоскости земли (Z = 0).

Положение камеры равно (0, 0, 320), а положение оранжевого шара на снимках равно x = 34,25 ; y = 33,1

Я попытался использовать два разных фрагмента кода, совместно используемых в Stackoverflow.

питон

 import numpy as np
import cv2

tvc =  [[0], [0], [320]]
rvc = np.array([0.0, 0.0, 0.0])

mtx = np.array([[1.85440409e 03, 0.00000000e 00, 9.60667535e 02], [0.00000000e 00, 1.85448038e 03, 5.39098310e 02], [0.00000000e 00, 0.00000000e 00, 1.00000000e 00]])

r = cv2.Rodrigues(rvc)

Lcam = mtx.dot(np.hstack((r[0], tvc)))

px = 960
py = 540
Z = 0
C = np.linalg.inv(np.hstack((Lcam[:,0:2],np.array([[-1*px],[-1*py],[-1]])))).dot((-Z*Lcam[:,2]-Lcam[:,3]))
print(C)
 

MATLAB

 K = [1854.40409, 0.0, 960.667535; 0.0, 1854.48038, 539.09831; 0.0, 0.0, 1.0]; %intrinsic mat
T = [0, 0, 320]';

%roll pitch yaw

R = [0, 0, 0];

px = 960;
py = 540;
R = rotationVectorToMatrix(R)';
H = K * [R T];
Q = inv([H(:,1) H(:,2) -[px;py;1]])*-H(:,4);
W = Q(1:2)
 

Изображение, сделанное камерой, направленной прямо вниз

Изображение, сделанное с ориентацией камеры с шагом 6 градусов

Изображение, сделанное с ориентацией камеры с шагом 8 градусов

Изображение, сделанное с ориентацией камеры 6 градусов крена

Изображение, сделанное с ориентацией камеры 11 градусов крена