opencv - 相机标定(OpenCV 2.3)——如何使用畸变参数?

标签 opencv camera-calibration

我有一组带有一些附加标记的刚体图像。我定义了一个以这些标记之一为原点的坐标系,我想获得该坐标系与在相机原点定义的坐标系之间的旋转和平移。

我尝试了一段时间 POSIT(在 this 之后),但从未得到可接受的结果,直到我意识到我必须首先校准相机。基于this并使用一些用校准体获取的图像,我得到了相机内在矩阵和畸变参数。我还遇到了 1.276 的错误 (?) 重新投影错误。

  1. 重投影误差是否过高?我该如何改进它? (我使用了更多的图片,只是实现了轻微的值(value)下降)。
  2. 我可以在 POSIT 中使用失真参数吗?怎么样?

谢谢。


似乎减少重投影误差(从 ~1.3 变为 ~0.7)的唯一方法是将 XML 配置文件中的以下参数设置为“0”:

<Calibrate_FixAspectRatio> 0 </Calibrate_FixAspectRatio>
<Calibrate_AssumeZeroTangentialDistortion> 0 </Calibrate_AssumeZeroTangentialDistortion>
<Calibrate_FixPrincipalPointAtTheCenter> 0 </Calibrate_FixPrincipalPointAtTheCenter>

使用更多图片不会改变错误,我仍然不确定这个新错误是否可以接受。

我在 POSIT 中使用校准给出的值作为输出(即焦距和光学中心),但结果与我使用预校准值时得到的结果非常相似。我没有使用失真参数,因为我不知道如何在 POSIT 中处理它们(它们会对结果产生影响吗?)。

标定后得到的相机矩阵:

<Camera_Matrix type_id="opencv-matrix">
<rows>3</rows>
<cols>3</cols>
<dt>d</dt>
<data>
2.0613885351075501e+003 0. 2.2865517805186334e+002 0.
2.2546461307897816e+003 2.5261706201677623e+002 0. 0. 1.
</data>
</Camera_Matrix>

以及我在 POSIT 中使用它的方式:

#define FOCAL_LENGTH 2158.0175
#define FOCAL_LENGTH_X 2061.389 
#define FOCAL_LENGTH_Y 2254.646
#define cX 203.655
#define cY 205.117

我计算了新中心坐标与校准图像中心坐标之间的差异,然后将该差异应用于我正在使用 POSIT 处理的图像的中心坐标。

我在两个不同的图像上使用 POSIT,理论上我应该在模型和相机坐标系之间旋转 0(第一个)和 10(第二个)度。在我得到每个图像的旋转矩阵后,我在相机坐标系上定义了一个单位向量,并通过将它乘以 POSIT 给出的两个旋转矩阵的逆来在模型坐标系上计算它,在模型中得到两个新向量坐标系。当我在模型坐标系中计算这两个向量之间的角度时,输出不是应该的 - 10 度。

有人知道我哪里出错了吗?

最佳答案

图像分辨率是多少?主点应靠近图像中心。镜头的焦距是多少?根据您需要的精度,该校准误差可能没有问题。 为了避免镜头畸变引入的错误,您应该使用 undistortPoints 对传递给 POSIT 的图像点进行去畸变。这个误差有多大取决于你镜头的畸变有多大。

关于opencv - 相机标定(OpenCV 2.3)——如何使用畸变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11273571/

相关文章:

python - 无法使用 opencv 和 python 在相机校准和 3D 重建中绘制极线

python - 使用 OpenCV (Python) 将 2 个图像写入时长 10 秒的视频

opencv - findContours 寻找 Blob

python - OpenCV Python列表附加问题

c++ - findChessboardCorners 的 OpenCV 问题

python - 相机标定,像素方向反投影

OpenCV:基本矩阵和移动相机

matlab - 相机校准库

opencv - 筛选与冲浪。哪个更准确?

python - 使用python opencv检测刻度线