8、単眼カメラのキャリブレーション opencv+python

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 です。

おすすめ

転載: blog.csdn.net/csucmee502/article/details/130007305