首页 > 解决方案 > 从 (u, v) 像素坐标获取 2D 世界 (x, y) 坐标

问题描述

我使用 Airsim 平台创建了无人机相机图像。我正在尝试将相机图像中的像素转换为世界平面上的 (x,y) 坐标。我知道相机的外在和内在矩阵。我尝试使用这些矩阵的逆进行转换,但结果似乎与真实值相去甚远。我在类似的问题上尝试了很多方法,但都没有成功的结果。

下面我分享从不同角度拍摄的图像以及我用于反向转换的代码。从 320 米高度拍摄的图像,假设所有物体都在地平面 (Z = 0)。

相机的位置是 (0, 0, 320),图片中橙色球的位置是 x = 34.25 ;y = 33.1

我尝试使用 Stackoverflow 上共享的两段不同的代码。

PYTHON

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 度滚动拍摄的图像

标签: opencvimage-processingcomputer-vision

解决方案


推荐阅读