![]() |
OpenCV 5.0.0
Open Source Computer Vision
|
前のチュートリアル: キャリブレーションパターンの作成
次のチュートリアル: OpenCVによるカメラキャリブレーション
| 原著者 | Victor Eruhimov |
| 互換性 | OpenCV >= 4.0 |
このチュートリアルの目的は、一連のチェスボード画像を用いてカメラをキャリブレーションする方法を学ぶことである。
テストデータ: data/chess フォルダ内の画像を使用する。
次に、画像中のチェスボードを検出し、カメラからの距離を求めるコードを書こう。この方法は、画像中で検出できる既知の3D形状を持つ任意の物体に適用できる。
テストデータ: data フォルダ内の chess_test*.jpg 画像を使用する。
Mat img = imread(argv[1], IMREAD_GRAYSCALE);
bool found = findChessboardCorners( img, boardSize, ptvec, CALIB_CB_ADAPTIVE_THRESH );
FileStorage fs( filename, FileStorage::READ ); Mat intrinsics, distortion; fs["camera_matrix"] >> intrinsics; fs["distortion_coefficients"] >> distortion;
vector<Point3f> boardPoints; // fill the array ... solvePnP(Mat(boardPoints), Mat(foundBoardCorners), cameraMatrix, distCoeffs, rvec, tvec, false);
質問: カメラ原点から任意のコーナーまでの距離をどのように計算するか? 答え: 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ノルムを適用することと等価である。