OpenCV 5.0.0
Open Source Computer Vision
読み込み中...
検索中...
見つかりません
🤖 AIによる機械翻訳(非公式) — これは OpenCV 5.0.0 公式リファレンス(英語)を AI (Claude) で自動翻訳したものです。訳に誤りを含む場合があります。正確な情報は 公式英語版(原文) を参照してください。
正方形チェスボードによるカメラキャリブレーション

前のチュートリアル: キャリブレーションパターンの作成
次のチュートリアル: OpenCVによるカメラキャリブレーション

原著者Victor Eruhimov
互換性OpenCV >= 4.0

このチュートリアルの目的は、一連のチェスボード画像を用いてカメラをキャリブレーションする方法を学ぶことである。

テストデータ: data/chess フォルダ内の画像を使用する。

  • cmake の設定で BUILD_EXAMPLES を ON にして、サンプル付きで OpenCV をコンパイルする。
  • bin フォルダに移動し、imagelist_creator を使って画像のXML/YAMLリストを作成する。
  • 次に、calibration サンプルを実行してカメラパラメータを取得する。正方形のサイズには3cmを用いる。

ポーズ推定

次に、画像中のチェスボードを検出し、カメラからの距離を求めるコードを書こう。この方法は、画像中で検出できる既知の3D形状を持つ任意の物体に適用できる。

テストデータ: data フォルダ内の chess_test*.jpg 画像を使用する。

  • 空のコンソールプロジェクトを作成する。テスト画像を読み込む:
    Mat img = imread(argv[1], IMREAD_GRAYSCALE); 
  • findChessboard 関数を使ってこの画像中のチェスボードを検出する:
    bool found = findChessboardCorners( img, boardSize, ptvec, CALIB_CB_ADAPTIVE_THRESH ); 
  • 次に、任意の座標系におけるチェスボードの3D座標の vector<Point3f> 配列を生成する関数を書く。簡単のため、チェスボードのコーナーの一つを原点とし、ボードが平面 z = 0 上にあるような座標系を選ぶことにする。
  • XML/YAMLファイルからカメラパラメータを読み込む:
    FileStorage fs( filename, FileStorage::READ ); Mat intrinsics, distortion; fs["camera_matrix"] >> intrinsics; fs["distortion_coefficients"] >> distortion; 
  • これで `solvePnP` を実行してチェスボードの姿勢を求める準備が整った:
    vector<Point3f> boardPoints; // fill the array ... solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix, distCoeffs, rvec, tvec, false); 
  • calibration サンプルと同様に再投影誤差を計算する(opencv/samples/cpp/calibration.cpp の computeReprojectionErrors 関数を参照)。

質問: カメラ原点から任意のコーナーまでの距離をどのように計算するか? 答え: solvePnP を用いてカメラ姿勢を取得した後、回転(rvec)および並進(tvec)ベクトルが、ワールド(チェスボード)座標とカメラ座標系の間の変換を定義する。カメラ原点から任意のチェスボードコーナーまでの距離を計算するには、まず3D点をチェスボード座標系からカメラ座標系へ変換し(まだ行っていない場合)、次にL2ノルムを用いてそのユークリッド距離を計算する。例えば次のようになる:

    // assuming 'point' is the 3D position of a chessboard corner in the camera coordinate system
    double distance = norm(point);

これは3D点の座標(x, y, z)にL2ノルムを適用することと等価である。