opencv有没有计算重投影点的函数?

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

从给定的世界点(原始坐标)、内在矩阵、旋转矩阵和平移向量计算重投影点、重投影误差和平均重投影误差的过程是什么?

有没有内置的opencv函数,或者我们应该计算manuallay?

如果我们必须手动计算,获得重投影点的最佳方法是什么?

opencv image-processing computer-vision camera-calibration reprojection-error
2个回答
0
投票

projectPoints
将 3D 点投影到图像平面。

calibrateCamera
返回最终的重投影误差。
calibrateCamera
从校准图案的多个视图中找到相机的内在和外在参数。

该函数估计相机的内在参数和外在参数 每个视图的参数。该算法基于 [Zhang2000]1 和 [BouguetMCT]2。 3D 物体点的坐标和 必须指定它们在每个视图中相应的 2D 投影。 这可以通过使用具有已知几何形状的物体来实现 容易检测到的特征点。这样的对象称为 校准装置或校准模式,OpenCV 内置 支持棋盘作为校准装置(参见

findChessboardCorners()
)。

该算法执行以下步骤:

  1. 计算初始内在参数(该选项仅可用 对于平面校准图案)或从输入中读取它们 参数。失真系数最初全部设置为零 除非指定了某些

    CV_CALIB_FIX_K?

  2. 估计初始值 相机的姿势就好像内部参数已经知道一样。 这是使用

    solvePnP()
    完成的。

  3. 运营全球 Levenberg-Marquardt 最小化重投影误差的优化算法,即 观察到的特征点之间距离的平方总和

    imagePoints
    和预计的(使用相机的当前估计 参数和姿势)对象点
    objectPoints
    。看
    projectPoints()
    了解详情。该函数返回最终结果 重投影错误。

1张正友。一种灵活的相机校准新技术。 模式分析和机器智能,IEEE Transactions on,2000,22.11:1330-1334。

2J.Y.布盖。 MATLAB 校准工具。 http://www.vision.caltech.edu/bouguetj/calib_doc/


0
投票

基于张的校准纸的 openCV 的 calibrateCamera() 就是您所需要的 https://www.microsoft.com/en-us/research/wp-content/uploads/2016/02/tr98-71.pdf

为了让这个答案简短,我无法在这里解释数学。

以下是该过程的简短摘要:

  1. 获取同一参考对象的多个视图,例如棋盘
  2. 输入objectPoints、imagePoints和其他参数,您将得到畸变系数、3x3相机固有矩阵、旋转向量和平移向量。
  3. 校准内部相机矩阵后,您将能够使用函数 cv.projectPoints 计算重新投影点,该函数将 3D 点投影到 2D 成像平面

为此,您将需要 opencv,但为了简单起见,您可以使用 Python 版本的 opencv 来完成相同的操作,但会牺牲性能

https://docs.opencv.org/4.x/d9/d0c/group__calib3d.html#ga687a1ab946686f0d85ae0363b5af1d7b

祝你好运!

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