3

OpenCV C++ API を使用してカメラのキャリブレーションを実行し、一連の既知の世界と画像のポイント マッチを使用したいと考えています。

OpenCV には、ここcv::calibrateCameraに記載されているように呼び出される関数があります。これは、関数が平面オブジェクトの固有のカメラ行列を推定し、ユーザーが非平面 3D 環境の行列を指定することを期待していることを明確に述べています。

私のポイント通信では、世界座標は平面ではありません。また、内部カメラ マトリックスについては、適切な推測ができません。

この場合、カメラのキャリブレーションはどのように行えばよいでしょうか?

現在、関数を使用した計算に単純な DLT ベースのアプローチを使用していcv::SVD::solveZます。しかし、OpenCV が実行する非線形推定を使用したいと思います。

4

2 に答える 2

2

このページでは、カメラの自動キャリブレーションを実行する方法について説明します。これには、希望する非線形手法を使用して解けるように見えるクルッパ方程式を使用する方法が含まれます。

于 2013-02-16T15:41:00.667 に答える
0

私は同じ状況にありました。非平面 3D ターゲットがありますが、キャリブレーション プロセスに OpenCV の非線形 LM 最適化を使用したいと考えていました。(OpenCV で使用される Zhang の初期化方法では、平面キャリブレーション ターゲットのみが許可されます)

できることは、独自の DLT 結果からカメラ行列を抽出し、これを の初期推定として使用することですcalibrateCamera。1 組 (カメラ ポイント - オブジェクト ポイント) だけで十分です。他のペアは他のカメラ マトリックスを生成する可能性がありますが、それらは類似していることを願っており、初期化のためにのみそのマトリックスが必要になります。

ただし、独自の DLT を使用すると、P同種のワールド ポイントXを hom にマッピングする射影行列が得られると思います。画像点x経由での発送となりx = P * Xます。

これは行くべき道でしょう、それはPythonにありますが、あなた自身のニーズに適応できるはずです:

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は、正の焦点距離と 0 のスキューを想定し、それcameraMatrix[2,2]==1に制約されているため、上記のコードで示したように、カメラ マトリックスを修正する必要があることに注意してください。

于 2016-11-11T13:38:48.320 に答える