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

Posted

技术标签:

【中文标题】OpenCV:SolvePnP 对相同的输入参数给出不同的结果【英文标题】:OpenCV : SolvePnP is giving different results for same input parameters 【发布时间】:2017-10-16 20:21:03 【问题描述】:

我正在尝试在 python 中使用solvePnP 估计对象的 3D 姿势。 但问题是,即使我将相机和对象都保持静态,solvePnPrvectvec)的输出也在发生变化。世界坐标系以对象为中心并随之移动。我正在传递 4 个图像点和相应的 4 个对象点。

调用 SolvePnP:

retval, rvec, tvec = cv2.solvePnP(cam.object_points, cam.image_points, cam.camera_matrix, cam.dist_coefficients, None, None, False, cv2.SOLVEPNP_ITERATIVE)

输出 1:

Image points: 
[[ 236.  243.]
 [  43.  368.]
 [ 404.  372.]
 [ 235.  357.]]
Object points: 
[[ 0.   0.   0. ]
 [ 6.5  0.   0. ]
 [ 0.   0.   6.5]
 [ 0.   6.5  0. ]]
R VECT==========
[[-0.56619693]
 [-2.27732794]
 [ 0.71053527]]
T VECT==========
[[ 0.54725923]
 [-0.45834745]
 [ 0.58522831]]

输出 2:

Image points: 
[[ 236.  243.]
 [  43.  369.]
 [ 404.  372.]
 [ 235.  357.]]
Object points: 
[[ 0.   0.   0. ]
 [ 6.5  0.   0. ]
 [ 0.   0.   6.5]
 [ 0.   6.5  0. ]]
R VECT==========
[[ 0.33325838]
 [ 2.12767845]
 [ 0.98248134]]
T VECT==========
[[ -2.60687131]
 [  0.37989386]
 [ 23.85078678]]

物点和图像点是相同的,但solvePnP仍然给出几个不同的结果。上面的结果是一个接一个的交替换帧。

我应该如何解决?

【问题讨论】:

SolvePnP 是一种non-deterministic 算法,这意味着它是随机的,因此相同的输入会有不同的结果。 但是我使用了 ITERATIVE 标志的剧烈变化 是否有链接说明solvePnp 中的非确定性?我知道有一个 solvePnpRansac 版本,它绝对是不确定的。 请提供所有输入数据(示例中缺少相机矩阵和畸变系数)。 【参考方案1】:

您可以尝试查看solvePnpGeneric,它会返回所有可能的解决方案。 solvePnp 可能会在两个解决方案之间犹豫不决,并给你交替的结果。

solvePnpGeneric 是在OpenCV 4.1.2 中引入的,它允许访问不同的解决方案以及它们的重新投影错误。

【讨论】:

以上是关于OpenCV:SolvePnP 对相同的输入参数给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

opencv solvepnp函数各种方法比较

相机位姿估计1_1:OpenCV:solvePnP二次封装与性能测试

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

opencv solvePnP,所有轴看起来都不错,除了 Y

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

xCode 中的 OpenCV 错误:输入参数的大小不匹配