使用 OpenCV SolvePnP 进行高架相机的姿态估计会导致高度偏离几厘米

Posted

技术标签:

【中文标题】使用 OpenCV SolvePnP 进行高架相机的姿态估计会导致高度偏离几厘米【英文标题】:Overhead camera's pose estimation with OpenCV SolvePnP results in a few centimeter off height 【发布时间】:2018-05-25 21:42:33 【问题描述】:

我想获得高架摄像机的姿势(平移:x、y、z 和旋转:世界坐标系中的 Rx、Ry、Rz)。通过用机械臂移动 ChArUco 校准板,我得到了许多对象点和图像点(例如 https://www.youtube.com/watch?v=8q99dUPYCPs)。因此,我已经有了所有对象点的确切位置。

为了向solvePnP 提供许多点,我将第一个检测到的图案(ChArUco 板)设置为第一个对象,并将其用作对象坐标系的原点。然后,我将检测到的对象点(从第二个模式到最后一个模式)添加到第一个检测到的对象点的坐标系(对象框架的原点是第一个对象的原点)。

在我得到相机和物体坐标系之间的变换后,我根据这个变换计算了相机的位姿。

结果一开始看起来还不错,但是当我用尺子或卷尺测量相机的绝对位姿时,我注意到外部校准结果在 z 方向偏离了大约 15-20 毫米(高度相机),尽管对于其他(x、y、Rx、Ry、Rz)几乎是正确的。结果是一样的,即使我通过不同的方式移动机械臂来改变对象点的范围,它最终总是会偏离高度几厘米。

有没有人遇到过类似的问题?我想知道我可以尝试的任何事情。深度方向(z)不准确时常见的错误是什么?

【问题讨论】:

你测量物体到相机哪个部分的距离,到底是什么?镜头?相机内部的感光成像传感器?你的相机姿势是哪一个? 我从镜头测量。 花了很多时间后,我注意到相机的输出默认被纠正了。使用未校正的图像解决了这个问题,尽管当我从相机获取点云数据时,相机框架中的 y 方向仍有一厘米的偏差。 【参考方案1】:

我不知道您如何测量 z,但我相信您用尺子测量的不是 z,而是 euclidean distance,其计算方式如下:

d=std::sqrt(x*x+y*y+z*z);

举个例子,如果x=2; y=2; z=2; 那么d 将是d~3,5 所以3.5-2=1.5 是你在z 和标尺之间得到的差异z 方向大约偏离15-20 毫米.

【讨论】:

我将估计的姿势转换为世界框架并测量每个 x、y、z 方向。我测量的是 z,而不是欧几里得距离。

以上是关于使用 OpenCV SolvePnP 进行高架相机的姿态估计会导致高度偏离几厘米的主要内容,如果未能解决你的问题,请参考以下文章

使用 SolvePnP 在 openCV 中的旋转和平移顺序问题

OpenCV:SolvePnP 对相同的输入参数给出不同的结果

如何使用鱼眼相机参数解决 PnP?

来自 cv::solvePnP 的世界坐标中的相机位置

在 OpenCV 中检测对象然后计算对象/相机的位姿

通过单应性或solvePnP()函数估计相机位姿