2013-02-16 74 views
3

我想用OpenCV C++ API執行攝像機標定,使用一組已知的圖像點匹配。使用OpenCV進行攝像機標定

OpenCV的一個名爲cv::calibrateCamera作爲記錄here功能。這明確提到,該功能將推導用於平面物體的內部相機矩陣,並且它期望用戶 指定用於非平面3D環境的矩陣。

在我的點對應中,世界座標不是平面的。我對內部攝像頭矩陣沒有一個合格的猜測。

在這種情況下,我該如何校準相機?

目前,我使用了使用cv::SVD::solveZ函數的計算基於簡單的DLT方法。但我想使用OpenCV執行的非線性估計。

+0

如果您有能力在Windows上的單獨程序中脫機運行相機跟蹤,請查看[ACTS](http://www.zjucvg.net/acts/acts.html)。我遇到了同樣的問題,但ACTS在攝像機校準方面做得非常好。很抱歉,我無法幫助您實現OpenCV。 – TaZ 2013-02-16 10:27:12

回答

2

This page解釋瞭如何執行相機自動校準。這包括一種使用Kruppa方程的方法,這種方法似乎可以使用所需的非線性技術解決。

0

我是在同樣的情況:我有一個非平面的三維目標,但是我想用的OpenCV的非線性LM-優化校準過程。 (由OpenCV的使用張的初始化方法只允許平面校準目標)

你可以做的是提取從你自己的DLT結果相機矩陣,並以此作爲對calibrateCamera初始猜測。如果只爲一對完成就足夠了(相機點 - 對象點)。儘管其他對可能會生成其他相機矩陣,但它們希望是相似的,您只需要該矩陣即可進行初始化。

請注意,儘管如此,通過您自己的DLT,您可以獲得投影矩陣P,該投影矩陣將同類世界點X映射到hom。圖像點x通過x = P * X

這將是要走的路,這是蟒蛇雖然,你應該能夠適應自己的需要:

P = YOUR_DLT(imagePoints[0], objectPoints[0]) 

cameraMatrix, _, _, _, _, _, _ = cv2.decomposeProjectionMatrix(P) 
cameraMatrix /= cameraMatrix[2,2]   # ensure unit elem[2,2] 
cameraMatrix[0,1] = 0      # ensure no skew 
cameraMatrix[0,0] = abs(cameraMatrix[0,0]) # ensure positive focal lengthes 
cameraMatrix[1,1] = abs(cameraMatrix[1,1]) 

# ensure principal point within image: 
cameraMatrix[0,2] = min(resX-1, max(0, cameraMatrix[0,2])) 
cameraMatrix[1,2] = min(resY-1, max(0, cameraMatrix[1,2])) 

retval, cameraMatrix, distCoeffs, rvecs, tvecs = \ 
     cv2.calibrateCamera(objectPoints, imagePoints, imageSize, cameraMatrix) 

注意,因爲calibrateCamera假設cameraMatrix[2,2]==1和約束爲正的焦距和0偏斜,相機矩陣可能需要更正,正如我在上面的代碼中所展示的那樣。