所以我有一个全高清网络摄像头(LG AN VC500),俯视棋盘,每个方形边缘为25毫米。 我试图估计相机相对于棋盘的三维坐标。
我使用openCV和C ++以及以下基本过程:
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图像。
我的问题是:
我花了很多时间试图解决这个问题,其中大部分花费在堆栈溢出上。我的截止日期现在变得真实。任何帮助表示赞赏,如果需要,我会提供更多信息。 感谢。
答案 0 :(得分:1)
SolvePnP使用包含图像中心的相机矩阵(来自相机校准),如果您以任何其他分辨率使用它,则必须调整相机矩阵。
详细信息取决于您是从图像中取出640x480窗口(在这种情况下只调整原点)还是重新缩放图像(在这种情况下您还需要更改焦距)
答案 1 :(得分:0)
我上面提到的程序是正确的。结果也是正确的,但我误解了它们。结果是相对于棋盘原点垂直于棋盘的相机中心的平移坐标。结果也在相机校准的单位中。如果以毫米为单位进行校准,那么 solvepnp 给出的平移向量也将以毫米为单位。
我认为这是棋盘起源的中心主线点。
至于分辨率差异,如果您的相机(在openCV代码中)设置为与相机兼容的特定分辨率(请检查此兼容性),那么openCV将处理该大小的图像。