opencv相机校准object_points方向

Posted

技术标签:

【中文标题】opencv相机校准object_points方向【英文标题】:opencv camera calibration object_points orientation 【发布时间】:2017-09-05 19:39:38 【问题描述】:

我正在开发一个 opencv 项目并关注不同的来源,这些来源包括书籍和一些源代码。我发现书和一些源代码之间存在差异。当使用已知的棋盘校准相机时,我们定义了一个由棋盘角组成的对象点。例如左上角是(0,0),下一个是(0,1)。但是在书中,坐标系用作(y,x),而在源代码中我在互联网上找到了它的(x,y),正如我在示例中给出的那样。右边是+x,下边是+y。

书中的代码:

for (int i=0; i<boardSize.height; i++) 
    for (int j=0; j<boardSize.width; j++) 
        objectCorners.push_back(cv::Point3f(i, j, 0.0f));
    

摘自源代码:

 for (int i = 0; i < board_height; i++)
      for (int j = 0; j < board_width; j++)
        obj.push_back(Point3f((float)j * square_size, (float)i * square_size, 0));

哪个是正确的?

编辑:

我检查了本书的下一个版本,作者在相关部分使用了相同的循环。

【问题讨论】:

恕我直言,这取决于您想要获得的 3D 坐标系。 问题是一切都一样,只是这一部分。相同的功能不能给出不同的坐标系输出? @米卡 你的意思是输入?您为对象点选择的坐标系可以是任意的。因此,您是否希望棋盘的较长边成为您的 x 轴或 y 轴或 z 轴或对角线或房间中的任何其他位置,都取决于您。 哦,你说当我改变 x 和 y 的位置时,输出也会反转? 是的,我的意思是输入。你能把你的评论作为答案。 @米卡 【参考方案1】:

您为对象点选择的坐标系可以是任意的。

因此,您是否希望棋盘的较长边成为您的 x 轴或 y 轴或 z 轴、对角线或房间中的任何其他位置,都取决于您。

您可能只需要记住对所用坐标系的限制。它可能是笛卡尔坐标系。这意味着如果您选择“错误”的顺序,您将从错误的一侧“看”到对象。 也许这就是为什么他们在书中实验性地选择了不同的顺序?

【讨论】:

书中没有使用对象。它只是一个示例代码,食谱风格。谢谢您的回答。对我来说足够了。【参考方案2】:

从相机校准的openCV文档中找到here,当他们演示Point3f的使用时,在我链接的页面的一半多一点处,他们以与源代码相同的方式使用它( j, i)。

文档中的代码:

for( int i = 0; i < boardSize.height; ++i )
for( int j = 0; j < boardSize.width; ++j )
    corners.push_back(Point3f(float( j*squareSize ), float( i*squareSize ), 0));

我会模仿文档并对这本书持保留态度,但最好的做法是尝试这两个示例。

【讨论】:

我如何从结果中理解。他们可能非常接近。比较他们的重投影误差? 我不知道,我最近才开始使用openCV,只是知道在哪里可以找到更多信息。 这里也一样。感谢您的回复。正如 Micka 所说,这取决于我们的坐标系。 欢迎您 :3 并记住:付款 (***.com/help/how-to-answer) 说“谢谢”表示感谢,但这并不能回答问题。相反,请投票选出对您最有帮助的答案!如果这些答案对您有所帮助,请考虑以更具建设性的方式表达感谢 - 通过在此处为您的同行提出的问题贡献您自己的答案。

以上是关于opencv相机校准object_points方向的主要内容,如果未能解决你的问题,请参考以下文章

在线校准相机中校准相机时出现 OpenCV 运行时错误

相机校准 OpenCV 相机作为输入

OpenCV 2.3 相机校准

OpenCV 相机校准

用于 OpenCV 的 Iphone 6 相机校准

OpenCV校准相机裁剪错误