opencv 相机校准 object_points 方向
opencv camera calibration object_points orientation
我正在从事一个 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));
哪个是正确的?
编辑:
我检查了本书的下一版本,作者在相关部分使用了相同的循环。
从相机校准的 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));
我会模仿文档并对本书持保留态度,但更好的做法是尝试这两个示例。
您为对象点选择的坐标系可以是任意的。
因此,您是否希望棋盘的长边是您的 x 轴、y 轴或 z 轴或对角线或房间中的其他任何位置都取决于您。
您可能只需要记住所用坐标系的限制。它可能是笛卡尔的。这意味着如果您选择 "wrong" 顺序,您将 "look" 从错误的一侧到对象。
也许这就是他们实验性地选择书中不同顺序的原因?
我正在从事一个 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));
哪个是正确的?
编辑:
我检查了本书的下一版本,作者在相关部分使用了相同的循环。
从相机校准的 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));
我会模仿文档并对本书持保留态度,但更好的做法是尝试这两个示例。
您为对象点选择的坐标系可以是任意的。
因此,您是否希望棋盘的长边是您的 x 轴、y 轴或 z 轴或对角线或房间中的其他任何位置都取决于您。
您可能只需要记住所用坐标系的限制。它可能是笛卡尔的。这意味着如果您选择 "wrong" 顺序,您将 "look" 从错误的一侧到对象。 也许这就是他们实验性地选择书中不同顺序的原因?