簡體   English   中英

在開放CV和3D坐標中進行立體校准

[英]Stereo Calibration in Open CV and 3D Coordinates

我是OpenCV的初學者,目前正在從事一個項目,該項目需要將像素精確映射到厘米/毫米/任何現實世界單位。

我已經在OpenCV執行了立體聲校准,然后進行了立體聲校正。 因此,我同時獲得了內在和外在參數。

進行立體聲校准時,我沒有輸入棋盤格的確切正方形尺寸(25mm x 25mm)。 我只輸入了水平和垂直內角的數量以及板子的數量。 那么當我重新投影到3D時會產生影響嗎? 如果是這樣,我如何在StereoCalibrate函數中包括平方大小。

其次,從相機矩陣獲得的值fxfy均為513.86,而從EXIF數據得出的值為3.7mm。 那么,兩者之間的確切關系是什么?

第三,我使用了reprojectImageTo3D並獲得了3d世界坐標。 現在這些坐標的確切單位是多少(厘米/毫米/英寸/英寸等)?

基本上,我想獲得從像素到現實世界單位的精確映射,經過大量的閱讀和搜索,我仍然無法做到這一點。 請幫助我解決這個問題。

我同意前兩個問題的其他答案。 但是只是為了進一步澄清和詳細說明,

1)

在下面的代碼塊中查看參數“ squareSize”。

這是您提供正方形大小的地方。 它的作用是計算棋盤中每個角的位置,並將其推入點的向量(稱為objectPoints)。 這是可能的,因為棋盤具有規則的圖案。

然后,向量objectPoints成為StereoCalibrate函數的第一個參數。

另外,請記住,無論您為squareSize指定的單位如何,校准結果(當然fx和fy除外)都將以相同單位顯示。

    for( j = 0; j < boardSize.height; j++ ){
        for( k = 0; k < boardSize.width; k++ ){
            objectPoints.push_back(Point3f(j*squareSize, k*squareSize, 0));
        }
    }

2)

得到的fx和fy將以像素為單位。 為了獲得以毫米為單位的焦距,您需要將其乘以比例因子。

fx,fy與實際焦距(以毫米為單位)之間的關系由相機傳感器的尺寸確定。 您應該能夠在相機規格中找到此參數。

我上面提到的縮放比例將是相機傳感器每毫米的像素數。

3)

您獲得的3D世界坐標正是您提到的。 座標 從系統中的某個點引用。 它們是對象點的xyz坐標 坐標沒有單位!

到目前為止,我可以回答兩個第一個問題:

1: cv :: stereoCalibrate中的第一個參數是對象點的向量,可以使用以下函數填充它:

void CalcBoardCornerPositions(cv::Size boardSize, double squareSize, std::vector<cv::Point3f>& corners) {
    corners.clear();
    for( int i = 0; i < boardSize.height; ++i )
        for( int j = 0; j < boardSize.width; ++j )
            corners.push_back(cv::Point3f(float( j*squareSize ), float( i*squareSize ), 0)); 
}

然后使用它:

 std::vector<std::vector<cv::Point3f> > objectPoints(1);
 CalcBoardCornerPositions(boardSize, squareSize, objectPoints[0]);
 cv::stereoCalibrate(objectPoints, imagePointsA, imagePointsB, _cameraMatrixA, /// etc

2:實際上,相機矩陣fx和fy分別是焦距乘以 x和y方向上的像素密度。 那意味着

fx = f * cx

fy = f * cy

其中cx = imageSize.width / sensorSize.width,而cy = imageSize.height / sensorSize.height。 通常在現代相機中cx == cy。 您可以在相機手冊中找到相機傳感器的尺寸。

  1. 函數StereoCalibrate的第一個參數是您需要自己創建的校准圖案的實際尺寸。 例如,如果您有一個3mm正方形的棋盤格6x5,則需要創建一個矩陣,該矩陣包含棋盤上參考系統ex [(0,0,0)(0,3,0)(0,6,0)...]等。
  2. 焦距以像素尺寸表示。 您應該只檢查像素的實際尺寸(通常以微米為單位),然后將fxfy乘以它。
  3. 單位取決於創建校准圖案的方式(問題編號1)。 在該示例中,我使棋盤具有3毫米的正方形,因此網格中拐角的位置以毫米表示。 這就是結果的單位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM