#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 градусов крена