2017-09-05 141 views
2

我正在开发一个opencv项目,并遵循不同的书籍和源代码。我发现书和一些源代码有区别。当使用已知的棋盘来校准照相机时,我们定义由棋盘角落制成的物体点。例如左上角是(0,0),下一个是(0,1)。但在书中,坐标系用作(y,x),而我在源代码中找到它的(x,y)如我在示例中给出的。右侧是+ x,下侧是+ y。opencv相机校准object_points方向

在本书中的代码:

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

哪一个是正确的?

编辑:

我查了书的下一版本和作家将使用有关的部分相同的循环。

+0

imho它取决于你想得到的三维坐标系。 – Micka

+0

问题是一切都是一样的,但这部分。同样的功能不能给出不同的坐标系输出? @Micka – ssovukluk

+0

你的意思是输入?您为目标点选择的坐标系可以是任意的。因此,您是否希望棋盘的长边是您的x或y或z轴,还是对角线或房间中的任何其他位置。 – Micka

回答

0

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

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

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

+0

书中没有使用任何对象。它只是一个示例代码,食谱风格。谢谢您的回答。够我了。 – ssovukluk

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

我会模仿的文件,并采取本书半信半疑,但最好的事情是尝试两个例子。

+0

我如何从结果中理解。他们可能非常接近。 Comparin他们的再投影错误? – ssovukluk

+0

我不知道,我最近才刚开始使用openCV,并且知道在哪里寻找更多信息。 – hammeramr

+0

同样在这里。感谢您的回复。正如Micka所说,它取决于我们的坐标系。 – ssovukluk