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

Posted

技术标签:

【中文标题】如何使用鱼眼相机参数解决 PnP?【英文标题】:How can I solvePnP with fisheye camera parameters? 【发布时间】:2019-11-27 03:05:00 【问题描述】:

我看到 OpenCV 的 solvePnP() 函数假设您的相机参数来自针孔模型。但是我使用cv.fisheye 模块校准了我的相机,所以我想知道如何将solvePnP 与从该鱼眼模块获得的参数一起使用。

如何将鱼眼相机参数与solvePnP() 一起使用?

【问题讨论】:

【参考方案1】:

根据 docs.opencv.org,您有来自 cv::fisheye::calibrate() 的 K, D, rvecs, tvecs。

您可以使用cv.fisheye.undistortPoints() 从输入坐标distorted 中移除K 和D 的影响,请参阅here。

所以例程必须是:

    undistorted = cv.fisheye.undistortPoints(distorted, K, D) cv.solvePnP(objPoints, undistorted, I, D)I=np.eye(3), D=np.zeros((1,5))

祝你好运

【讨论】:

我如何确定这会起作用?我在内部看到solvePnP 使用cv.undistortPoints 而不是cv.fisheye.undistortPoints。我尝试用相同的参数评估这两个函数,它们返回不同的结果(即使 np.eye(3) 和 np.zeros((1,5)) 用作相机参数)。这些函数是否需要返回与识别相机矩阵相同的输出? 看来解决方案正在奏效。虽然我不明白它为什么起作用。我证明的方法是通过实验。这个想法是从物体姿势到图像点,然后再回到物体姿势。并查看是否保留了对象姿势。我生成了一个随机的rvectvec,执行imgpoints = cv.fisheye.projectPoints(objectPoints,rvec,tvec,K,D),然后使用imgpoints 执行solvePnP,如答案中所述。通过solvePnP获得的输出rvectvec与原始旋转和平移非常匹配(有1e-7错误)。所以这是通过实验证明它的工作原理! 很高兴听到它有效。 cv.fishey 中的相机模型使用与 docs.opencv.org 中不同的镜头失真模型,这就是为什么应该使用 cv.fisheye.undistortPoints() 来消除失真效果。 我知道您应该使用cv.fisheye.undistortPoints() 来消除失真效果。但我并不低估为什么cv.undistortPoints(imgpoints, np.eye(3), np.zeros(4)) 不等于cv.fisheye.undistortPoints(imgpoints, np.eye(3), np.zeros(4))。第一个函数对我来说很有意义,它返回与imgpoints 相同的值。但是第二个函数返回了一些我不明白的东西。为什么他们都不返回imgpoints 研究原因很有趣。原因很简单,因为computation procedure of the distortion model of fisheye lens in opencv 我也发现自己很好奇;这与正常的针孔投影情况完全相反。一个相关的*** q&a was found to be here。

以上是关于如何使用鱼眼相机参数解决 PnP?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用opencv将鱼眼相机拍摄的图像转换为平面(矩形)图像?

在无法访问相机的情况下消除鱼眼效果

如何找到未失真的鱼眼图像和正常图像之间的差异?

如何使用 OpenCV 使裁剪后的鱼眼图像不失真

如何通过openCV模拟鱼眼镜头效果?

在 3ds max 2016 中如何纠正 VRay 渲染的鱼眼图像?