1.opencv単眼カメラのキャリブレーションプロセス
- 校正プレートのサイズに応じて、現実世界の校正プレートの座標を決定します
- さまざまな角度からキャリブレーションボードの写真を撮ります
- opencv の findChessboardCorners を使用して、各キャリブレーション ボードのコーナー座標を計算します。
- opencv の calibrateCamera インターフェイスを使用して、コーナーポイントの 3D 座標とピクセル座標に従ってカメラパラメータを調整します。
2. 現実世界でのキャリブレーション プレートの座標を定義します。
キャリブレーションボードを撮影するには 2 つの方法があります。
- カメラを固定し、キャリブレーションプレートを移動して、さまざまな角度からの撮影を実現します
- キャリブレーション ボードを固定し、カメラを移動し、さまざまな角度からキャリブレーション ボードを撮影します。
ここでは 2 番目の方法を使用すると仮定します。キャリブレーション ボードを固定し、世界座標系を固定し、世界座標系の原点としてキャリブレーション ボード上の任意の角点を選択します。x 軸と y 軸はキャリブレーション ボードの平面に沿っています。 、z 軸はキャリブレーション ボードの平面に垂直です。キャリブレーション プレートは常に xy 平面上にあるため、キャリブレーション プレート平面上のすべての点について z=0 です。
次に、キャリブレーション ボードをさまざまな角度から撮影する必要があります。キャリブレーション ボードを撮影するときは、次の点に注意する必要があります。
- キャリブレーション プレートとカメラの間の距離は、イメージング プレーンの少なくとも 20% がキャリブレーション プレートでカバーされるようにする必要があります。
- 少なくとも10〜20枚の写真を撮ってください
- 1 回のパスでより高い精度を得るには、PNG などの非圧縮画像形式を使用してみてください。
- カメラに対してさまざまな方向でキャリブレーション プレートを撮影し、カメラ面に対するキャリブレーション プレートの偏向角を可能な限り 45° 未満にする必要があります。
- 撮影した写真をトリミングするなど、画像を加工しないでください
- 撮影プロセス中にオートフォーカスの方法を採用せず、プロセス中に焦点距離を変更しないでください。
- 取得されたキャリブレーション プレート パターンはフレームのできるだけ多くを占め、レンズの歪みは中心からの距離に応じて放射状に増加しますが、これはフレーム全体で一貫していません。レンズの歪みを捉えるためには、パターンがフレームの端をカバーする必要があります。キャプチャされた画像。
3. 校正液
- まず、キャリブレーション ボードの 2D 座標を見つけます。対応する API は次のとおりです。
retval、コーナー = cv2.findChessboardCorners(画像、パターンサイズ、フラグ)
画像: 単一のチェッカーボード キャリブレーション画像。8 ビット グレースケールまたはカラー画像である必要があります。
patternSize: チェッカーボード グリッド列、行ごとの内側のコーナー ポイントの数 (points_per_row、points_per_column)
コーナー: 検出されたコーナー配列を出力します。
フラグ: コーナーを見つける方法を定義します。
cv2.cornerSubPix(画像、コーナー、winsize、zeroZone、基準)
画像: 単一のチェッカーボード キャリブレーション画像。8 ビット グレースケールまたはカラー画像である必要があります。
コーナー: コーナーポイントの初期座標を入力します。
winSize: 検索ウィンドウの長さの半分
criteria: コーナー ポイントの最適化反復の終了基準。1 つはコーナー ポイントの最適化の最大反復回数 cv2.TERM_CRITERIA_MAX_ITER、もう 1 つはコーナー ポイントの移動変位が cv2.TERM_CRITERIA_EPS 未満であることです。
- カメラ キャリブレーションの 2 番目のステップでは、対応する API は次のとおりです。
retval、cameraMatrix、distCoeffs、rvecs、tvecs = cv2。CalibrateCamera(objectPoints, imagePoints,imageSize)
objectPoints: 3 次元のコーナー点のベクトル
imagePoints: 2D 点座標のベクトル
ImageSize: 画像解像度
CameraMatrix: カメラ内部パラメータ行列
distCoefs: 歪みパラメータ
rvecs: 回転行列
tvecs: 変換行列
retval: RMS 再投影エラー
4.歪み補正
キャリブレーション後、次の API を含む画像の歪み補正を実行できます。
新しいカメラマトリックス、有効PixROI = cv2。getOptimalNewCameraMatrix(cameraMatrix,distCoeffs, imageSize, alpha[, newImgSize[, centerPrinciplePoint]])
CameraMatrix: カメラの内部参照
distCoeffs: 歪みパラメータの入力ベクトル
imageSzie: 元の画像の解像度
alpha: 歪み補正のピクセル保持方法を制御します。alpha = 0、補正されたイメージのすべてのピクセルが有効であることを示します、alpha = 1、補正されたイメージは元のイメージのすべてのピクセルを保持します。
newCameraMatrix: フリースケーリングパラメータに基づいて、カメラ内部パラメータを最適化
validPixROI: 補正画像の有効ピクセル領域
dist = cv2.undist(src, CameraMatrix, disCoeffs[, newCameraMatrix])、この関数は次の 2 つの関数を重ね合わせたものと等価です。
src: 補正する元の画像
CameraMatrix: カメラの内部参照
distCoeffs: 歪みパラメータのベクトル
dst: 歪み補正後の出力画像
newCameraMatrix: 補正対象の画像に対応する内部カメラ参照
マップ1、マップ2 = cv2.initUndistortRectifymap(cameraMatrix、distCoeffs、R、newCameraMatrix、size、m1type)
CameraMatrix: カメラの内部参照
distCoeffs: 歪みパラメータ
R: オプション、3*3 整流変換行列
newcameraMatrix: 新しいカメラの内部パラメータ。通常、単眼の CameraMatrix と同じです。
size: 補正後の画像サイズ
map1: 最初のマッピング行列、mapx(x,y)
map2: 最初のマッピング行列、mapy(x,y)
dst = cv .remap(src, map1,map2, interpolation[,dst[,borderMode[,borderValue]]])
ソース: 元の画像
dst: マップされたイメージ。src と同じサイズとデータ型です。
map1: 最初のマッピング行列、dst (x, y) に対応する src の x 座標
map2: 2 番目のマッピング行列、dst (x, y) に対応する src の y 座標
interpolation: 補間方法、線形補間など。
borderMode: 境界値の処理方法
borderValue: borderMode は、固定値が満たされたときの毎日のリチャージです。デフォルトは 0 です。