【发布时间】:2014-11-20 20:09:50
【问题描述】:
所以我有一个全高清网络摄像头 (LG AN VC500),俯视棋盘,每个方边为 25 毫米。 我正在尝试估计相机相对于棋盘的 3 维坐标。
我使用 openCV 和 C++ 以及以下基本程序:
- 校准相机 -> 获取相机矩阵和畸变系数
- findChessboardCorners -> 获取 imagePoints
- SolvePnP -> 获取 rvec 和 tvec
- rodrigues -> rvec 到 RMatrix
- 转置 RMatrix
- (-RMatrix * tvec) -> 获取 TVector
姿势 =
[RMatrix TVector(0) ... TVector(1) ... TVector(2) 0, 0, 0, 1 ]在 openGL 中绘图^
^ 我知道 GL 和 CV 的轴差异,主要关注的是姿态估计,而不是表示。
据我所知,这种方法应该可行。但是我的翻译并没有给我任何接近正确值的地方。不仅在正确的距离单位中,而且 x、y 和 z 值相对于彼此甚至没有意义。根据我的结果,棋盘的原点位于任意块中,而不是外角。
我怀疑这个问题可能是因为我的相机在其流式分辨率 1280 x 720 下进行了校准,因此根据该分辨率给了我一个相机矩阵,而 openCV 只处理 640 x 480 的图像。
我的问题是:
- 我遵循的程序是否正确?如果没有,我做错了什么?如何获得以毫米为单位的翻译?
- 分辨率差异有影响吗?我应该修改特定代码还是相机矩阵。
我花了很多时间试图弄清楚这一点,其中大部分时间都花在了堆栈溢出上。我的最后期限现在变成了现实。任何帮助表示赞赏,如果需要,我会提供更多信息。 谢谢。
【问题讨论】: