opencv相机校准object_points方向

时间:2017-09-05 19:39:39

标签: c++ opencv camera-calibration

我正在开发一个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));

哪一个是正确的?

编辑:

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

2 个答案:

答案 0 :(得分:0)

来自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));

我会模仿文档并拿出一本书,但更好的办法就是尝试这两个例子。

答案 1 :(得分:0)

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

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

您可能只需要记住使用的坐标系的限制。它可能是笛卡尔式的。这意味着如果你选择&#34;错误&#34;订购你会&#34;看&#34;从错误的一方到对象。 也许这就是为什么他们在实验中选择了书中不同的顺序?