2017-09-05 135 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