opencv - 从 (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)
解决方案
推荐阅读
- jquery - 为不同的数据库实体显示相同的模式形式
- python - 此 python 有效,但正在寻找更优雅的解决方案(Try and Catch with 1/0 hack)
- excel - 如何粘贴到 Excel 过滤器中的可见单元格中?
- sql - 如何获得每个客户每天花费的最大时间
- c# - 用值展平表达式参数
- javascript - 在不考虑时区的情况下将字符串转换为日期 - 打字稿
- java - 使用 ContentResolver 和 openInputStream() (Android)
- excel - 使用 COUNTIF / VLOOKUP 进行库存管理
- ruby - 发生 Ruby 异常:在 Logstash ruby 过滤器中没有将 String 隐式转换为 Integer
- python - 如何将日期列与日期进行比较并添加文本列?