![]() |
OpenCV 4.13.0
Open Source Computer Vision
|
このチュートリアルでは、複数カメラキャリブレーションツールボックスの使い方を示す。このツールボックスは「ランダム」パターンキャリブレーションオブジェクトの使用に基づいているため、チュートリアルは主に2つの部分から構成される。「ランダム」パターンの紹介と、複数カメラキャリブレーションである。
ランダムパターンとは、ランダムに生成された画像である。多くの特徴点を持つように「ランダム」になっている。生成後、印刷してキャリブレーションオブジェクトとして使用する。以下の2枚の画像は、ランダムパターンと、それを撮影した写真である。
ランダムパターンを生成するには、ccalib モジュールのクラス cv::randpattern::RandomPatternGenerator を使用する。次のように実行する。
ここで width と height はパターン画像の幅と高さである。パターンを取得したら、それを印刷していくつかの写真を撮影する。
これでこれらの画像を使ってカメラをキャリブレーションできる。まず、objectPoints と imagePoints を検出する必要がある。それらを検出するには、クラス cv::randpattern::RandomPatternCornerFinder を使用する。サンプルコードは次のとおりである。
ここで変数 patternWidth と patternHeight は、選択した測定単位でのキャリブレーションオブジェクトの物理的な寸法を指す。vecImg はキャリブレーション画像を格納する画像のベクトルである。
次に、cv::calibrateCamera や cv::omnidir::calibrate のようなキャリブレーション関数を使ってカメラをキャリブレーションする。
ここで複数カメラキャリブレーションに移る。現時点では、このツールボックスはランダムパターンオブジェクトを使用する必要がある。
複数のカメラをキャリブレーションするには、まずランダムパターンの写真をいくつか撮影する必要がある。もちろん、外部パラメータをキャリブレーションするには、1つのパターンが複数のカメラ(少なくとも2台)によって同時に視野に入る必要がある。もう1つの点として、どのカメラとどのパターンで写真が撮影されたかをプログラムが把握できるよう、画像ファイルは「cameraIdx-timestamp.*」という名前にする必要がある。同じタイムスタンプの写真は、複数のカメラで撮影された同じオブジェクトであることを意味する。さらに、cameraIdx は0から始める必要がある。ファイル名の例として「0-129.png」「0-187.png」「1-187」「2-129」などがある。
次に、複数カメラキャリブレーションを次のように実行できる。
ここで cameraType はカメラの種類を示し、multicalib::MultiCameraCalibration::PINHOLE と multicalib::MultiCameraCalibration::OMNIDIRECTIONAL がサポートされている。全方位カメラについては、詳細は cv::omnidir モジュールを参照する。nCamera はカメラの数である。inputFilename は opencv/sample の imagelist_creator によって生成されたファイルの名前である。ランダムパターンとキャリブレーション画像の名前を格納し、最初のファイル名はランダムパターンの名前である。patternWidth と patternHeight はパターンの物理的な幅と高さを表す。showFeatureExtraction は、特徴抽出処理を表示するかどうかを決定するブール値フラグである。nMiniMatches は各フレームで検出されるべき点の最小数であり、これを下回るとそのフレームは破棄される。outputFilename はキャリブレーション引数を格納するXMLである。