2D coords到3D coords分辨率和相机矩阵

时间:2014-11-20 20:09:50

标签: c++ opencv camera

所以我有一个全高清网络摄像头(LG AN VC500),俯视棋盘,每个方形边缘为25毫米。 我试图估计相机相对于棋盘的三维坐标。

我使用openCV和C ++以及以下基本过程:

  • 校准相机 - >得到相机矩阵和失真系数
  • findChessboardCorners - >获取imagePoints
  • SolvePnP - >得到rvec和tvec
  • rodrigues - > rvec到RMatrix
  • 转置RMatrix
  • ( - RMatrix * tvec) - >获得TVector
  • pose = [RMatrix TVector(0) ... TVector(1) ... TVector(2) 0, 0, 0, 1 ]

  • 在openGL中绘图^

^我知道GL和CV之间的轴差异,主要关注的是姿势估计,而不是表示。

据我所知,这种方法应该有效。但我的翻译并没有给我任何接近正确值的地方。不仅在正确的距离单位,而且x,y和z值甚至不相对于彼此有意义。根据我的结果,棋盘的起源在某个任意区块,而不是外角。

我怀疑问题可能是我的相机在1280 x 720的流分辨率下校准,因此根据该分辨率为我提供相机矩阵,而openCV仅处理640 x 480图像。

我的问题是:

  1. 我遵循的程序是否正确?如果没有,我做错了什么,如何以毫米为单位获得翻译?
  2. 分辨率差异是否有所不同?我应该修改特定代码还是相机矩阵。
  3. 我花了很多时间试图解决这个问题,其中大部分花费在堆栈溢出上。我的截止日期现在变得真实。任何帮助表示赞赏,如果需要,我会提供更多信息。 感谢。

2 个答案:

答案 0 :(得分:1)

SolvePnP使用包含图像中心的相机矩阵(来自相机校准),如果您以任何其他分辨率使用它,则必须调整相机矩阵。

详细信息取决于您是从图像中取出640x480窗口(在这种情况下只调整原点)还是重新缩放图像(在这种情况下您还需要更改焦距)

答案 1 :(得分:0)

我上面提到的程序是正确的。结果也是正确的,但我误解了它们。结果是相对于棋盘原点垂直于棋盘的相机中心的平移坐标。结果也在相机校准的单位中。如果以毫米为单位进行校准,那么 solvepnp 给出的平移向量也将以毫米为单位。

我认为这是棋盘起源的中心主线点。

至于分辨率差异,如果您的相机(在openCV代码中)设置为与相机兼容的特定分辨率(请检查此兼容性),那么openCV将处理该大小的图像。