从2D到3D的投影是错误的,无论使用哪种方法

问题描述 投票:0回答:1

我正在尝试将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/

http://ksimek.github.io/2013/08/13/intrinsic/

python opencv linear-algebra projection
1个回答
0
投票

只是UE4对旋转矩阵感到奇怪。我在Blender 2.79中对问题进行了建模,如果您使用ZYX(ypr)旋转相机并在代码中向滚动添加180度偏移(即180-reported_angle),则一切工作都将完美进行。

Upshot了解您的引擎,以及它如何符合或不符合已发布的标准!

© www.soinside.com 2019 - 2024. All rights reserved.