我正在尝试将2D图像点投影到3D点,并且似乎有很多错误信息与关于如何执行操作的信息一样多。我有在UE4中建模的问题,我知道:
相机位置:(1077,1133,450)
相机旋转(度):偏航= 90,俯仰= 345,侧倾= 0
相机水平视场(度):54.43224
摄像机垂直FOV(度):32.68799
相机剪切:0
相机分辨率:1280x720
世界上的对象位置:(923,2500,0)
图像框中的对象位置:(771,427)
根据以上数据和this method,我具有固有的摄像机矩阵:
K = [[1.24444399e+03 0.00000000e+00 6.40000000e+02]
[0.00000000e+00 1.22760403e+03 3.60000000e+02]
[0.00000000e+00 0.00000000e+00 1.00000000e+00]]
和旋转矩阵:
R = [[ 5.91458986e-17 -1.00000000e+00 -1.58480958e-17]
[ 9.65925826e-01 6.12323400e-17 -2.58819045e-01]
[ 2.58819045e-01 0.00000000e+00 9.65925826e-01]]
我用this tool.验证的
[我首先尝试在不使用此method的情况下不使用内部相机矩阵的情况下执行此操作,但这没有用,因为内部参数实际上是required
我接下来尝试了this solution,我在python中实现,删除了本来可以计算出我已经拥有的内在和外在参数的代码:
def deproject_pixel(u,v):
inv_camera_rotation_matrix = np.linalg.inv(camera_rotation_matrix)
inv_camera_intrinsic_matrix = np.linalg.inv(K)
uv_matrix = np.array([
[u],
[v],
[1]])
tx = 1077
ty = 1133
tz = 450
txyz_matrix = np.array([
[-tx],
[-ty],
[-tz]])
Tx_Ty_Tz = np.dot(camera_rotation_matrix,txyz_matrix)
ls = inv_camera_rotation_matrix @ inv_camera_intrinsic_matrix @ uv_matrix
rs = inv_camera_rotation_matrix @ Tx_Ty_Tz
s = rs[2][0] / ls[2][0]
world_point = s*ls-rs
return world_point
我相信上面的代码等同于this coded solution in C++,但也许我弄错了?
正在运行的deproject_pixel(771,427)返回(929,1182,0),在X中接近但在Y中距离很远
然后我尝试了another implementation,它需要完整的相机矩阵M:
M = [email protected]((camera_rotation_matrix,Tx_Ty_Tz),1)
def deproject_pixel_2(u,v):
A = (M[0][1]-M[2][1]*u)/(M[1][1]-M[2][1]*v)
B = (M[2][0]*u-M[0][0])/(M[2][0]*v-M[1][0])
X = ((M[1][3]-M[2][3]*v)*A-M[0][3]+M[2][3]*u ) / (A*(M[2][0]*v-M[1][0])-M[2][0]*u+M[0][0])
Y = (M[0][3]-M[2][3]*u-B*(M[1][3]-M[2][3]*v)) / (B*(M[1][1]-M[2][1]*v)-M[0][1]+M[2][1]*u)
world_point = [X,Y,0]
return world_point
但是再次运行deproject_pixel_2(771,427)返回(929,1182,0),在X中接近但在Y中距离很远
有人可以指出我在这里做错了吗?矩阵计算不正确吗?这两个实现是否都以相同的方式同时出错?
UPDATE 1我将摄影机系统移至零位置并取消了旋转。现在,如果我沿单个轴旋转,则可以计算出旋转偏移量,但是将多个旋转轴合并可以更改所需的偏移量,因此,现在仅当存在单个旋转轴时,才可以正确地进行脱投影。有什么建议吗?我了解到Unreal may deal with rotation differently超出了标准符号的含义。
进一步阅读:
Transforming 2D image coordinates to 3D world coordinates with z = 0
OpenCV unproject 2D points to 3D with known depth `Z`
Get 3D coordinates from 2D image pixel if extrinsic and intrinsic parameters are known
https://answers.opencv.org/question/62779/image-coordinate-to-world-coordinate-opencv/
只是UE4对旋转矩阵感到奇怪。我在Blender 2.79中对问题进行了建模,如果您使用ZYX(ypr)旋转相机并在代码中向滚动添加180度偏移(即180-reported_angle),则一切工作都将完美进行。
Upshot了解您的引擎,以及它如何符合或不符合已发布的标准!