我是在同樣的情況:我有一個非平面的三維目標,但是我想用的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偏斜,相機矩陣可能需要更正,正如我在上面的代碼中所展示的那樣。
如果您有能力在Windows上的單獨程序中脫機運行相機跟蹤,請查看[ACTS](http://www.zjucvg.net/acts/acts.html)。我遇到了同樣的問題,但ACTS在攝像機校準方面做得非常好。很抱歉,我無法幫助您實現OpenCV。 – TaZ 2013-02-16 10:27:12