【问题标题】:Computing x,y coordinate (3D) from image point won't work从图像点计算 x,y 坐标 (3D) 不起作用
【发布时间】:2021-03-07 07:56:24
【问题描述】:

我试图在此处重复 this 代码以在 Python 上获得真实世界的坐标。但结果并不一致。

我的代码:

uvPoint  = np.matrix('222.84; 275.05; 1')
rots = cv2.Rodrigues(_rvecs[18])[0]
rot = np.linalg.inv(rots)
cam = np.linalg.inv(camera_matrix) 

leftSideMat  = rot * cam * uvPoint;
rightSideMat = rot * _tvecs[18];

s = np.true_divide((4.52 + rightSideMat), leftSideMat)

rot * (s * cam * uvPoint - _tvecs[18])

我的相机矩阵

array([[613.87755242,   0.        , 359.6984484 ],
       [  0.        , 609.35282925, 242.55955439],
       [  0.        ,   0.        ,   1.        ]])

旋转矩阵

array([[ 0.73824258,  0.03167042,  0.67379142],
       [ 0.13296486,  0.97246553, -0.19139263],
       [-0.66130042,  0.23088477,  0.71370441]])

和平移向量

array([[-243.00462163],
       [ -95.97464544],
       [ 935.8852482 ]])

我不知道 Zconst 是什么,但无论我为 z 常数尝试什么,我什至都无法接近真实世界的坐标,即 (36, 144)。我在这里做错了什么?

【问题讨论】:

  • 使用从立体校准过程中获得的 Q 矩阵进行 3D 重投影。见stackoverflow.com/questions/27374970/…
  • 我使用的是单相机。这对它有用吗?
  • 你从哪里获得深度?如果没有深度。图像中表示射线/线而不是 3D 点的任何像素
  • 我想做的是这样的:我把棋盘放在一个平面上,得到一个旋转和平移矩阵。这样我就可以测量同一表面上的平面物体。这可以在 Matlab 上使用 pointstoWorld 来实现。但是我的项目需要在python上完成。

标签: opencv


【解决方案1】:

根据您的评论。我认为您想要的是具有已知相机投影矩阵的姿势估计。

您应该查看此链接以了解您想要的 python 实现。 https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_calib3d/py_pose/py_pose.html

编辑

来自您的代码。看来您对左右矩阵的转换是正确的。但是你确定输入的旋转和平移是正确的吗?您可以尝试根据本教程在基于此旋转和平移的原始图像上绘制一个框吗?如果该框与数据中的 2D 投影模式一致。

如果可能的话。请发布您正在使用的原始图片。

编辑

请查看原帖,其中 scale s 的计算依据

输出向量中第三个位置的元素。 rightSideMat.at(2,0))/leftSideMat.at(2,0))

你正在这样做

rightSideMat)、leftSideMat)的输出向量

尝试使用相同的元素操作。右边,刻度 S 应该是一个浮点数 元素,而不是矩阵。

【讨论】:

  • 我检查了这个,事实上我正在研究很多东西。这种姿势估计将现实世界的点转换为图像点,而不是相反。我仍然不知道为什么没有代码。
  • 您的最后一次编辑解决了这个问题。非常非常感谢你。这是一个简单的类型问题。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多